webbudda
Goto Top

CSV mit batch bearbeiten - auslesen

Hallo,

ich habe viele unterordner mit *.csv-Dateien. Diese haben folgendes Format:

beispiel.csv:
name ; x
name 2 ; y
name 3 ; z
name 4 ; 1

beispiel2.csv:
name ; x2
name 2 ; y2
name 3 ; z2
name 4 ; 12

Aufgabe: alle csv-Dateien zusammen in eine einzelne mit folgendem Format zusammenführen.

alle.csv:
name; name 2; name 3; name 4
x; y; z; 1
x2; y2; z2; 12


Soweit war ich schon.
del alle.csv
dir /b /s *.csv > test.txt
echo name; name 2; name 3; name 4 >alle.csv
FOR /f "usebackq delims==" %%a IN (test.txt) DO type "%%a" >>alle.csv
del test.txt

Nur das "do" müsste sich jetzt so gestalten, dass er die erste "spalte" eines jeden csv ignioert. Kann mir dabei wer helfen?

Danke & gruß

Content-ID: 170639

Url: https://administrator.de/contentid/170639

Ausgedruckt am: 23.11.2024 um 19:11 Uhr

Friemler
Friemler 29.07.2011 um 16:18:40 Uhr
Goto Top
Hallo webbudda,

teste mal folgendes:
@echo off & setlocal

set "SrcDir=E:\Test"  
set "DestDir=E:\Ausgabe"  
set "OutFile=%DestDir%\Alle.csv"  

>"%OutFile%" echo Name;Name 2;Name 3;Name 4;  

for %%f in ("%SrcDir%\*.csv") do (  
  for /f "usebackq tokens=1* delims=;" %%l in ("%%f") do (  
    >>"%OutFile%" <NUL set /p "=%%m;"  
  )
  >>"%OutFile%" echo.  
)
Quell- und Zielverzeichnis müssen verschieden sein, sonst wird auch die Zieldatei von der äußeren FOR-Schleife gefunden und somit verarbeitet.

Kleiner Schönheitsfehler: Alle Zeilen der erzeugten CSV-Datei enden mit einem Semikolon, was quasi eine zusätzliche leere Spalte erzeugt. Falls die Datei nicht mit Excel weiterverarbeitet werden soll, einfach in Excel laden und nochmal als CSV speichern, dann verschwinden die abschließenden Semikolons.

Gruß
Friemler
webbudda
webbudda 29.07.2011 um 16:25:26 Uhr
Goto Top
Super, das klappt schon ganz gut. WIe kann ich das rekursiv gestalten, dass in %SrcDir% in allen unterordnern nach csv allen gesucht wird? thx
Skyemugen
Skyemugen 29.07.2011 um 16:27:43 Uhr
Goto Top
Aloha,

tja, heute ist Freitag, da bau ich wieder große Klötzchen *gg*

Wenn du wirklich nur vier Zeilen pro Datei hast und keine Semikola am Ende zusätzlich magst, hätte ich auch noch das meine übliche irgendwie geht das auch komplizierter - Nummer im Angebot:
@echo off & setlocal enabledelayedexpansion
set "Pfad=E:\Skripte\Ablage"  
set "Liste=E:\Skripte\alle.csv"  
if exist "%Liste%" del "%Liste%"  
>"%Liste%" echo name;name2;name3;name4  
for /f "delims=" %%s in ('dir /b /s "%Pfad%\*.csv"') do (  
	for /f "usebackq delims=; tokens=2" %%m in ("%%s") do (  
		set "Z4=!Z3!"  
		set "Z3=!Z2!"  
		set "Z2=!Z1!"  
		set "Z1=%%m"  
	)
	>>"%Liste%" echo !Z4!;!Z3!;!Z2!;!Z1!  
	
)
pause
goto :eof

greetz André

edit: Porzellan und so
webbudda
webbudda 29.07.2011 um 16:39:21 Uhr
Goto Top
Wenn das mit dem rekursiv noch rein kommt, ist alles gut. folgendes klappt nicht face-smile

for %%f in ('dir /b /s %SrcDir%\*.csv') do (
for /f "usebackq tokens=1* delims=;" %%l in ("%%f") do (
>>"%OutFile%" <NUL set /p "=%%m;"
)
>>"%OutFile%" echo.
)
Friemler
Friemler 29.07.2011 um 16:42:09 Uhr
Goto Top
Moin André,

der TO hat in seinen Beispieldaten bei "Name 4" numerische Werte angegeben. Keine Ahnung, ob das nun wirklich so ist oder ob es sich doch um Personennamen handelt. Bei numerischen Werten würde Dein Script aber möglicherweise in die Grütze fassen, da Du die Ausgabeumleitung hinter die Werte schreibst, die von ECHO ausgegeben werden. Dadurch könnte dann sowas wie echo x;y;z;2>>"%Liste%" entstehen. Somit würde diese Zeile als x;y;z; auf dem Bildschirm landen und nicht in der Datei.

Gruß
Friemler
Friemler
Friemler 29.07.2011 um 16:45:17 Uhr
Goto Top
Hallo webbudda,

sorry, das mit dem "rekursiv" habe ich verdrängt face-wink .

Versuche es mal so:
@echo off & setlocal

set "SrcDir=E:\Test"  
set "DestDir=E:\Ausgabe"  
set "OutFile=%DestDir%\Alle.csv"  

>"%OutFile%" echo Name;Name 2;Name 3;Name 4;  

for /r "%SrcDir%" %%f in (*.csv) do (  
  for /f "usebackq tokens=1* delims=;" %%l in ("%%f") do (  
    >>"%OutFile%" <NUL set /p "=%%m;"  
  )
  >>"%OutFile%" echo.  
)

Gruß
Friemler
Skyemugen
Skyemugen 29.07.2011 um 16:54:06 Uhr
Goto Top
Aloha Friemler,

in der Tat, das habe ich nicht bedacht aber im Test habe ich als Name 4 eine 1 und auch eine 2 und es stört ihn nicht, dennoch: sicher ist bestimmt sicher.

greetz André
Friemler
Friemler 29.07.2011 um 17:20:35 Uhr
Goto Top
Hallo André,

ah, das könnte mit der von Dir verwendeten verzögerten Variablenerweiterung zu tun haben, dann wird die Befehlszeile wohl anders geparst. Auch gut zu wissen.

Gruß
Friemler
webbudda
webbudda 31.07.2011 um 21:24:07 Uhr
Goto Top
Durchaus möglich, dass eine Zeile mit "2" endet. Würde also kein problem darstellen?
Friemler
Friemler 31.07.2011 um 22:45:19 Uhr
Goto Top
Hallo webbudda,

da Skyemugen sein Script geändert hat (und das anscheinend sowieso auch vorher kein Problem war), kannst Du beide der obigen Scripts verwenden.

Gruß
Friemler