Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Mehrere CSV Dateien zusammenfügen, nicht hintereinander, sondern parallel

Frage Entwicklung Batch & Shell

Mitglied: linm2002

linm2002 (Level 1) - Jetzt verbinden

12.07.2011 um 18:03 Uhr, 7355 Aufrufe, 15 Kommentare

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
Mitglied: Friemler
12.07.2011 um 18:59 Uhr
Hallo Min,

teste mal das hier:
01.
Const ForReading = 1 
02.
Const ForWriting = 2 
03.
 
04.
 
05.
'Anzahl der Parameter prüfen 
06.
If WScript.Arguments.Count > 2 Then 
07.
  Set objFSO     = CreateObject("Scripting.FileSystemObject") 
08.
  Set objOutFile = objFSO.OpenTextFile(WSCript.Arguments(0), ForWriting, True) 
09.
 
10.
  'Zähler für die schon verarbeiteten Zeilen pro Datei 
11.
  intSkipLines = 0 
12.
 
13.
  'Wiederholen, bis alle Zeilen jeder Datei verarbeitet wurden 
14.
  Do 
15.
    'Alle Eingabedateien nacheinander öffnen 
16.
    For intFileCntr = 1 To WScript.Arguments.Count - 1 
17.
      'Nachsehen, ob es zum aktuelllen Dateinamen auch eine Datei auf der Platte gibt 
18.
      'Wenn nicht, Abbruch 
19.
      If Not objFSO.FileExists(WScript.Arguments(intFileCntr)) Then 
20.
        WScript.Echo "Datei " & WScript.Arguments(intFileCntr) & " nicht gefunden." 
21.
        Exit Do 
22.
      End If 
23.
 
24.
      'Datei zum Lesen öffnen 
25.
      Set objInFile = objFSO.OpenTextFile(WScript.Arguments(intFileCntr), ForReading, False) 
26.
 
27.
      'So viele Zeilen überspringen wie bisher schon verarbeitet wurden 
28.
      For I = 1 To intSkipLines 
29.
        objInFile.SkipLine 
30.
      Next 
31.
 
32.
      'Wenn das Dateiende erreicht ist, Abbruch 
33.
      '=> Alle Dateien müssen die gleiche Anzahl Zeilen haben 
34.
      If objInFile.AtEndOfStream Then Exit Do 
35.
 
36.
      'Aktuelle Zeile einlesen und anhand des Semikolons in Felder 
37.
      'zerlegen und die einzelnen Felder in einem Array speichern 
38.
      arrLine = Split(objInFile.ReadLine, ";") 
39.
 
40.
      'Die erste Spalte der Ausgabedatei enthält die Elemente 
41.
      'der ersten Spalte der 1. Eingabedatei 
42.
      'Bei allen anderen Eingabedateien wird die erste Spalte überlesen 
43.
      If intFileCntr = 1 Then objOutFile.Write arrLine(0) 
44.
 
45.
      'Die übrigen Spalten der Eingabedatei in die Ausgabedatei schreiben 
46.
      'mit einem Semikolon als Trennzeichen 
47.
      For I = 1 To UBound(arrLine) 
48.
        objOutFile.Write ";" & arrLine(I) 
49.
      Next 
50.
 
51.
      'Eingabedatei schließen 
52.
      objInFile.Close 
53.
    Next 
54.
 
55.
    'Zeilenumbruch in Ausgabedatei schreiben 
56.
    objOutFile.Write vbCRLF 
57.
 
58.
    'Anzahl zu überspringender Zeilen für den nächsten Durchlauf um 1 erhöhen 
59.
    intSkipLines = intSkipLines + 1 
60.
  Loop 
61.
 
62.
  'Ausgabedatei schließen 
63.
  objOutFile.Close 
64.
Else 
65.
  'Zu wenig Parameter => Fehlermeldung ausgeben 
66.
  WScript.Echo "Geben Sie mindestens eine Zieldatei und zwei Quelldateien als Parameter an." 
67.
End If
Aufruf:
cscript /nologo MergeCSV.vbs "OutFile" "InFile1" "InFile2" "InFile3" ... "InFileN"
Alle Eingabedateien müssen die gleiche Anzahl Zeilen haben.

Gruß
Friemler
Bitte warten ..
Mitglied: pieh-ejdsch
12.07.2011 um 19:13 Uhr
moin Min,

was Leichtes nach Zeilennummern

01.
@echo off&setlocal 
02.
set "File1=Datei 1" 
03.
set "Neu=Alles.csv" 
04.
type nul>"%neu%" 
05.
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%File1%"') do (set "Line=%%j" 
06.
  for %%a in ( 
07.
    "Datei 2" 
08.
    "Datei n" 
09.
    WriteIn: 
10.
  ) do (if not "%%~a" == "WriteIn:" for /f "tokens=1* delims=;" %%b in ('findstr /n "^" "%%~a"^|findstr /b "%%i:"') do set "LineB=%%c" 
11.
    setlocal enabledelayedexpansion 
12.
    if not "%%~a" == "WriteIn:" ( for /f "delims=" %%d in ("!Line!;!LineB!") do endlocal& set "Line=%%d" 
13.
    ) else ( >>"%neu%" echo\!Line! 
14.
      endlocal 
15.
)  )  )
ungetestet einen Vergleich nachgezogen
[Edit]
to late - da war Friemler wieder schneller


Gruß Phil
Bitte warten ..
Mitglied: linm2002
12.07.2011 um 21:22 Uhr
Hallo Friemler,

erstmal vielen Dank für die schnelle Antwort.

Ich bin hier ein absoluter Anfänger, und hab deine Code nicht 100% verstanden. Kannst du mir genau sagen, was ich machen soll?

Ich habe jetzt zum Test 3 csv-Dateien abgelegt (c:\test\test1.csv; test2.csv; test3.csv), die gleiche Anzahl der Zeilen haben. Deine Code habe ich als MergeCSV.vbs und zum Aufruf habe ich

cscript /nologo MergeCSV.vbs "OutFile.csv" "test1.csv" "test2.csv" "test3.csv"

als test.bat Datei in den selben Ordner gespeichert.

Doppelklicken test.bat, hat nichts passiert.

Gruß
Min
Bitte warten ..
Mitglied: linm2002
12.07.2011 um 21:33 Uhr
Hallo Phil,

vielen Dank erstmal

deine Code habe ich wie folgenden angepasst und als test.bat gespeichert:

01.
@echo off&setlocal 
02.
set "File1=test1.csv" 
03.
set "Neu=Alles.csv" 
04.
type nul>"%neu%" 
05.
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%File1%"') do (set "Line=%%j" 
06.
  for %%a in ( 
07.
    "test2.csv" 
08.
    "test3.csv" 
09.
    WriteIn: 
10.
  ) do (if not "%%~a" == "WriteIn:" for /f "tokens=1* delims=;" %%b in ('findstr /n "^" "%%~a"^|findstr /b "%%i:"') do set "LineB=%%c" 
11.
    setlocal enabledelayedexpansion 
12.
    if not "%%~a" == "WriteIn:" ( for /f "delims=" %%d in ("!Line!;!LineB!") do endlocal& set "Line=%%d" 
13.
    ) else ( >>"%neu%" echo\!Line! 
14.
      endlocal 
15.
)  )  )

leider hat es nicht geklappt. Habe ich was falsch gemacht?

Gruß
Min
Bitte warten ..
Mitglied: Friemler
12.07.2011 um 22:50 Uhr
Hallo Min,

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]
Bitte warten ..
Mitglied: pieh-ejdsch
12.07.2011 um 22:52 Uhr
liegt wird Die Test bat im gleichen Verzeichnis wie die *.CSV getartet, dann sollte es funktionieren.

sonst gibst Du die Kompletten Pfade mit an oder Wechselst zu beginn des Batches mit
pushD "D:\Das Verzeichnis mit den CSVs"
ins Verzeichnis und zum Ende des Batches mit
popD
wieder heraus.

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
Bitte warten ..
Mitglied: Friemler
12.07.2011 um 23:09 Uhr
Hi Phil,

Zitat von pieh-ejdsch:
ich versuch mich auch grad ein bissel in VBS Einzulesen

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
Bitte warten ..
Mitglied: Biber
12.07.2011 um 23:45 Uhr
[OT]
Moin Friemler,

Zitat von Friemler:
Textdateien mit beliebigem Inhalt zu verarbeiten ist in Batchscript immer eine Lotterie.
Ja, und ergänzend dazu...
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]
Bitte warten ..
Mitglied: linm2002
13.07.2011 um 00:06 Uhr
Hallo Friemler,

in den csv-Dateien steht:

Datum;Z1;Z2;Z3
01.01.2011 00:00;1;2;3
02.01.2011 00:00;2;3;4

alle 3 Test csv-Dateien sind identisch. Wie Du gesagt hast, habe ich die Datei OutFile.csv im Verzeichnis angelegt und die Test.bat mit der Zeile PAUSE ergänzt. Es sieht jetzt wie folgenden aus:

01.
cscript /nologo MergeCSV.vbs "OutFile.csv" "test1.csv" "test2.csv" "test3.csv" 
02.
PAUSE
Trotzdem schließt sich das Konsolenfenster sofort wieder und die Daten sind nicht in OutFile.csv zusammengefügt. Bin echt ratlos

Gruß
Min
Bitte warten ..
Mitglied: linm2002
13.07.2011 um 00:20 Uhr
Hallo Phil,

die Code sind jetzt wie folgenden angepasst:

01.
echo on & setlocal 
02.
pushd "d:\Test\" 
03.
set "File1=test1.csv" 
04.
set "Neu=Alles.csv" 
05.
type nul>"%Neu%" 
06.
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%File1%"') do (set "Line=%%j" 
07.
	for %%a in ( 
08.
		"test2.csv" 
09.
		"test3.csv" 
10.
    		WriteIn: 
11.
) do (if not "%%~a" == "WriteIn:" for /f "tokens=1* delims=;" %%b in ('findstr /n "^" "%%~a"^|findstr /b "%%i:"') do set "LineB=%%c"   
12.
		setlocal enabledelayedexpansion 
13.
		if not "%%~a" == "WriteIn:" ( for /f "delims=" %%d in ("!Line!;!LineB!") do endlocal& set "Line=%%d"   
14.
		) else ( >>"%neu%" echo\!Line!  
15.
	endlocal 
16.
)  )  ) 
17.
popd
Es hat aber nicht funktioniert. Das Konsolenfenster schließt sich nach wie vor sofort wieder. Das verstehe ich echt nicht ...

PS: alle csv-Dateienn und bat-Datei sind in einem Ordner abgelegt.

Gruß
Min
Bitte warten ..
Mitglied: Friemler
13.07.2011 um 00:35 Uhr
Hallo Min,

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]
Bitte warten ..
Mitglied: pieh-ejdsch
13.07.2011 um 01:04 Uhr
Ö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
Bitte warten ..
Mitglied: Friemler
13.07.2011 um 01:08 Uhr
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
Bitte warten ..
Mitglied: linm2002
13.07.2011 um 01:09 Uhr
Hallo Friemler,

das ist echt klasse! Genau daran liegt es. Endlich funktioniert.

Nochmal vielen Dank an alle.

Gruß
Min
Bitte warten ..
Mitglied: pieh-ejdsch
13.07.2011 um 10:21 Uhr
Danke Friemler, jetzt versteh ich wenigstens nicht nur die Hälfte.

na, ein Programmierer muss doch Englisch können...
der Urschleim wurde doch auch Eingedeutscht "Hallo Welt!"

Gruß Phil
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
Mehrere.csv Dateien zusammenfügen zu einer Datei mit bat (4)

Frage von Piotrney zum Thema Batch & Shell ...

VB for Applications
gelöst Mehrere CSV Dateien aus verschiedenen Ordner einlesen via VBA (12)

Frage von mtufangil zum Thema VB for Applications ...

Batch & Shell
gelöst 2 Csv -Dateien zum Teil zusammenfügen (6)

Frage von Piotrney zum Thema Batch & Shell ...

Batch & Shell
gelöst Mehrere PDF-Dateien per Batch zusammenfügen (1)

Frage von Grimmli zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...