Mehrere CSV Dateien zusammenfügen, nicht hintereinander, sondern parallel
Hallo,
ich möchte gerne mehrere CSV Dateien per Batch zusammenfügen, aber nicht hintereinander, sondern parallel, hier ein Beispiel.
Datei 1:
Datum; Spalte 1; Spalte 2; ...; Spalte n
01.01.2011 00:00; 111; 222; ... ; nnn
02.01.2011 00:00; 222; 333; ... ; mmm
Datei 2:
Datum; Spalte 1; Spalte 2; ...; Spalte x
01.01.2011 00:00; 123; 234; ... ; yyy
02.01.2011 00:00; 234; 345; ... ; zzz
.
.
.
Datei n:
01.01.2011 00:00; ...; ...; ...
02.01.2011 00:00; ...; ...; ...
Daraus soll das werden:
Datum; Spalte 1; Spalte 2; ...; Spalte n; Spalte n+1; ... ; Spalte n+x; ...
01.01.2011 00:00; 111; 222; ... ; nnn; 123; 234; ... ; yyy; ...
02.01.2011 00:00; 222; 333; ... ; mmm; 234; 345; ... ; zzz; ...
hab lange nach der Lösung gesucht, leider nichts passendes gefunden.
Für eure Tipps wäre ich sehr dankbar.
Schöne Grüße
Min
ich möchte gerne mehrere CSV Dateien per Batch zusammenfügen, aber nicht hintereinander, sondern parallel, hier ein Beispiel.
Datei 1:
Datum; Spalte 1; Spalte 2; ...; Spalte n
01.01.2011 00:00; 111; 222; ... ; nnn
02.01.2011 00:00; 222; 333; ... ; mmm
Datei 2:
Datum; Spalte 1; Spalte 2; ...; Spalte x
01.01.2011 00:00; 123; 234; ... ; yyy
02.01.2011 00:00; 234; 345; ... ; zzz
.
.
.
Datei n:
01.01.2011 00:00; ...; ...; ...
02.01.2011 00:00; ...; ...; ...
Daraus soll das werden:
Datum; Spalte 1; Spalte 2; ...; Spalte n; Spalte n+1; ... ; Spalte n+x; ...
01.01.2011 00:00; 111; 222; ... ; nnn; 123; 234; ... ; yyy; ...
02.01.2011 00:00; 222; 333; ... ; mmm; 234; 345; ... ; zzz; ...
hab lange nach der Lösung gesucht, leider nichts passendes gefunden.
Für eure Tipps wäre ich sehr dankbar.
Schöne Grüße
Min
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 169591
Url: https://administrator.de/contentid/169591
Ausgedruckt am: 26.11.2024 um 01:11 Uhr
15 Kommentare
Neuester Kommentar
Hallo Min,
teste mal das hier:
Aufruf:
Alle Eingabedateien müssen die gleiche Anzahl Zeilen haben.
Gruß
Friemler
teste mal das hier:
Const ForReading = 1
Const ForWriting = 2
'Anzahl der Parameter prüfen
If WScript.Arguments.Count > 2 Then
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objOutFile = objFSO.OpenTextFile(WSCript.Arguments(0), ForWriting, True)
'Zähler für die schon verarbeiteten Zeilen pro Datei
intSkipLines = 0
'Wiederholen, bis alle Zeilen jeder Datei verarbeitet wurden
Do
'Alle Eingabedateien nacheinander öffnen
For intFileCntr = 1 To WScript.Arguments.Count - 1
'Nachsehen, ob es zum aktuelllen Dateinamen auch eine Datei auf der Platte gibt
'Wenn nicht, Abbruch
If Not objFSO.FileExists(WScript.Arguments(intFileCntr)) Then
WScript.Echo "Datei " & WScript.Arguments(intFileCntr) & " nicht gefunden."
Exit Do
End If
'Datei zum Lesen öffnen
Set objInFile = objFSO.OpenTextFile(WScript.Arguments(intFileCntr), ForReading, False)
'So viele Zeilen überspringen wie bisher schon verarbeitet wurden
For I = 1 To intSkipLines
objInFile.SkipLine
Next
'Wenn das Dateiende erreicht ist, Abbruch
'=> Alle Dateien müssen die gleiche Anzahl Zeilen haben
If objInFile.AtEndOfStream Then Exit Do
'Aktuelle Zeile einlesen und anhand des Semikolons in Felder
'zerlegen und die einzelnen Felder in einem Array speichern
arrLine = Split(objInFile.ReadLine, ";")
'Die erste Spalte der Ausgabedatei enthält die Elemente
'der ersten Spalte der 1. Eingabedatei
'Bei allen anderen Eingabedateien wird die erste Spalte überlesen
If intFileCntr = 1 Then objOutFile.Write arrLine(0)
'Die übrigen Spalten der Eingabedatei in die Ausgabedatei schreiben
'mit einem Semikolon als Trennzeichen
For I = 1 To UBound(arrLine)
objOutFile.Write ";" & arrLine(I)
Next
'Eingabedatei schließen
objInFile.Close
Next
'Zeilenumbruch in Ausgabedatei schreiben
objOutFile.Write vbCRLF
'Anzahl zu überspringender Zeilen für den nächsten Durchlauf um 1 erhöhen
intSkipLines = intSkipLines + 1
Loop
'Ausgabedatei schließen
objOutFile.Close
Else
'Zu wenig Parameter => Fehlermeldung ausgeben
WScript.Echo "Geben Sie mindestens eine Zieldatei und zwei Quelldateien als Parameter an."
End If
Aufruf:
cscript /nologo MergeCSV.vbs "OutFile" "InFile1" "InFile2" "InFile3" ... "InFileN"
Alle Eingabedateien müssen die gleiche Anzahl Zeilen haben.
Gruß
Friemler
moin Min,
was Leichtes nach Zeilennummern
ungetestet einen Vergleich nachgezogen
[Edit]
to late - da war Friemler wieder schneller
Gruß Phil
was Leichtes nach Zeilennummern
@echo off&setlocal
set "File1=Datei 1"
set "Neu=Alles.csv"
type nul>"%neu%"
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%File1%"') do (set "Line=%%j"
for %%a in (
"Datei 2"
"Datei n"
WriteIn:
) do (if not "%%~a" == "WriteIn:" for /f "tokens=1* delims=;" %%b in ('findstr /n "^" "%%~a"^|findstr /b "%%i:"') do set "LineB=%%c"
setlocal enabledelayedexpansion
if not "%%~a" == "WriteIn:" ( for /f "delims=" %%d in ("!Line!;!LineB!") do endlocal& set "Line=%%d"
) else ( >>"%neu%" echo\!Line!
endlocal
) ) )
[Edit]
to late - da war Friemler wieder schneller
Gruß Phil
Hallo Min,
dann müsste jetzt eigentlich eine Datei namens
Du könntest aber die
Bei mir funktioniert es auf jeden Fall.
Gruß
Friemler
[EDIT]
Da Du mit Phils Code auch kein Glück hattest - was steht denn in den CSV-Dateien drin?
[/EDIT]
dann müsste jetzt eigentlich eine Datei namens
OutFile.csv
im Verzeichnis angelegt worden sein. Eine Ausgabe im Sinne von "Dateien wurden gemergt" o.ä erfolgt nicht.Du könntest aber die
Test.bat
um eine Zeile mit dem Befehl PAUSE
ergänzen, dann schließt sich das Konsolenfenster nicht sofort wieder und Du kannst evtl. auftauchende Fehlermeldungen lesen.Bei mir funktioniert es auf jeden Fall.
Gruß
Friemler
[EDIT]
Da Du mit Phils Code auch kein Glück hattest - was steht denn in den CSV-Dateien drin?
[/EDIT]
sonst gibst Du die Kompletten Pfade mit an oder Wechselst zu beginn des Batches mit
pushD "D:\Das Verzeichnis mit den CSVs"
popD
auf der CMD-Line testen und Meldungen lesen - sonst mit echo on laufen lassen.
Bei mir tat es so wie es sollte.
Friemlers code ist eine VBS kein Batch
@Friemler schöne Doku - ich versuch mich auch grad ein bissel in VBS Einzulesen
Gruß Phil
Hi Phil,
wenn Du's nicht schon kennst - suche mit Google mal nach "script56.chm". Das ist eine Sprachreferenz zu VBScript und JScript. Damit findet man schnell einen Einstieg.
In manchen Fällen geht mir das Batchgeraffel mächtig auf den Senkel, da das coden in Batchscript dem durchschlängeln durch ein Minenfeld gleicht. In VBS kann man sich doch mehr auf den eigentlichen Algorithmus konzentrieren, ohne ständig irgendwelche Unzulänglichkeiten umschiffen zu müssen.
Jedes Ding halt für den Zweck, für den es am besten geeignet ist. Textdateien mit beliebigem Inhalt zu verarbeiten ist in Batchscript immer eine Lotterie.
Gruß
Friemler
wenn Du's nicht schon kennst - suche mit Google mal nach "script56.chm". Das ist eine Sprachreferenz zu VBScript und JScript. Damit findet man schnell einen Einstieg.
In manchen Fällen geht mir das Batchgeraffel mächtig auf den Senkel, da das coden in Batchscript dem durchschlängeln durch ein Minenfeld gleicht. In VBS kann man sich doch mehr auf den eigentlichen Algorithmus konzentrieren, ohne ständig irgendwelche Unzulänglichkeiten umschiffen zu müssen.
Jedes Ding halt für den Zweck, für den es am besten geeignet ist. Textdateien mit beliebigem Inhalt zu verarbeiten ist in Batchscript immer eine Lotterie.
Gruß
Friemler
[OT]
Moin Friemler,
Unabhängig vom verwendeten Werkzeug sollte nie die Frage vergessen werden, ob denn überhaupt eine Nachbearbeitung der beste und der einzige Plan ist.
Dieser lieb- und ideenlos von irgendwelchen Azubis in ein wehrloses Logfile geleierte Output, der auch diesem Thread auf ein halbwegs zumutbares Lesbarkeitsniveau hochformatiert wird ...
--- Ja hey!
- Entweder ich setze an der Quelle an, da wo die Daten geschrieben werden und bitte um Anpassung
- oder ich wechsele das Tool, weil offensichtlich ungeeignet oder ich schreibe ein eigenes.
Diesen immer wiederkehrenden Unsinn mit "Ich brauche aus einer völlig verqueren Textsalatdatei immer nur das achte Wort aus Zeile 144 und die darauffolgenden 12 Zeichen, aber mit führenden Nullen"....
--> das kann doch nicht wahr sein, dass bei der Erzeugung der Daten huschi-huschi in 12sec irgendwas rausgetrümmert und dankend angenommen wird und danach ohne einen einzigen Seufzer tagelang mit Batch, VBS und C# aus Zeichenbrei Informationen destilliert werden sollen.
Grüße
Biber
[/OT]
Moin Friemler,
Zitat von @Friemler:
Textdateien mit beliebigem Inhalt zu verarbeiten ist in Batchscript immer eine Lotterie.
Ja, und ergänzend dazu...Textdateien mit beliebigem Inhalt zu verarbeiten ist in Batchscript immer eine Lotterie.
Unabhängig vom verwendeten Werkzeug sollte nie die Frage vergessen werden, ob denn überhaupt eine Nachbearbeitung der beste und der einzige Plan ist.
Dieser lieb- und ideenlos von irgendwelchen Azubis in ein wehrloses Logfile geleierte Output, der auch diesem Thread auf ein halbwegs zumutbares Lesbarkeitsniveau hochformatiert wird ...
--- Ja hey!
- Entweder ich setze an der Quelle an, da wo die Daten geschrieben werden und bitte um Anpassung
- oder ich wechsele das Tool, weil offensichtlich ungeeignet oder ich schreibe ein eigenes.
Diesen immer wiederkehrenden Unsinn mit "Ich brauche aus einer völlig verqueren Textsalatdatei immer nur das achte Wort aus Zeile 144 und die darauffolgenden 12 Zeichen, aber mit führenden Nullen"....
--> das kann doch nicht wahr sein, dass bei der Erzeugung der Daten huschi-huschi in 12sec irgendwas rausgetrümmert und dankend angenommen wird und danach ohne einen einzigen Seufzer tagelang mit Batch, VBS und C# aus Zeichenbrei Informationen destilliert werden sollen.
Grüße
Biber
[/OT]
Hallo Min,
also das Konsolenfenster sollte sich nicht wieder direkt schließen, dafür ist ja der
Starte doch bitte über das Startmenü erstmal ein Konsolenfenster (CMD.exe). Wechsele dann mit
BTW: Die Datei
Gruß
Friemler
[EDIT]
Mir ist doch noch ein Szenario eingefallen, unter dem sich das Konsolenfenster direkt schließt: Du hast das Batchscript in Unicode-Codierung gespeichert. Falls Du es mit Notepad erstellt hast, lade das Batchfile in Notepad und gehe dann auf
[/EDIT]
also das Konsolenfenster sollte sich nicht wieder direkt schließen, dafür ist ja der
PAUSE
-Befehl. Mir ist jetzt auch kein Szenario eingefallen unter dem das passieren könnte.Starte doch bitte über das Startmenü erstmal ein Konsolenfenster (CMD.exe). Wechsele dann mit
CD
in dein Test-Verzeichnis und starte erst jetzt die Test.bat
. Dann müsste auf jeden Fall die Befehlszeile aus dem Batchfile ausgegeben werden und evtl. irgendeine Fehlermeldung erscheinen.BTW: Die Datei
OutFile.csv
brauchst Du nicht anzulegen. Die wird vom Script als Ausgabedatei erzeugt. Der erste Dateiname in der Befehlszeile nach dem Scriptnamen bezeichnet die Ausgabedatei, alle weiteren Dateinamen stehen für die Namen von Eingabedateien.Gruß
Friemler
[EDIT]
Mir ist doch noch ein Szenario eingefallen, unter dem sich das Konsolenfenster direkt schließt: Du hast das Batchscript in Unicode-Codierung gespeichert. Falls Du es mit Notepad erstellt hast, lade das Batchfile in Notepad und gehe dann auf
Menü Datei->Speichern unter...
. Wenn dort unten in der Mitte im Feld Codierung
Unicode oder UTF-8 steht, klappe die Combobox auf und wähle ANSI aus. Dann speichern. Bei den anderen Dateien bitte auch prüfen.[/EDIT]
Öffne erst eine CMD und ziehe den Batch dahinein, dann Enter.
Dann solltest Du alles Nachlesen können.
@Friemler die script56.chm hab ich noch nicht komplett durch to much english hab aber noch andere Seiten gefunden. Learning bei doing ist angebracht.
Gruß Phil
Dann solltest Du alles Nachlesen können.
@Friemler die script56.chm hab ich noch nicht komplett durch to much english hab aber noch andere Seiten gefunden. Learning bei doing ist angebracht.
Gruß Phil
Hey Phil,
na, ein Programmierer muss doch Englisch können...
Aber hier gibt es die Datei auch auf deutsch (Link ist unter der fetten Überschrift Microsoft Windows Script-Technologien - Hilfe).
Gruß
Friemler
na, ein Programmierer muss doch Englisch können...
Aber hier gibt es die Datei auch auf deutsch (Link ist unter der fetten Überschrift Microsoft Windows Script-Technologien - Hilfe).
Gruß
Friemler