PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mit Batchdatei CSV auslesen


Eminent
2003-12-15, 13:08:28
Hallo,

ich hab jetzt eine neue Aufgabe bekommen, ich soll mehrere CSV-Dateien auslesen und diese zusammen (immer anhängen) in eine gemeinsame (neue) CSV-Datei schreiben.

Leider muss ich aber gestehen habe ich noch nie in meinem Leben ne Batchdatei geschrieben, kann mir einer von euch sagen wie man sowas macht?

Danke schonmal

Harleckin
2003-12-15, 15:06:54
HIer ganz kurz meine kleine Lösung. Hat zwar nix mit einer klassischen Win32 Batchdatei zu tun, funktioniert aber bestens.

#!/bin/sh
OUTPUT=/tmp/foo.cvs
for FILE in `ls *.csv`
do
cat $FILE >> $OUTPUT
done

HTH

Tom Servo
2003-12-15, 15:54:22
Unter Windows müsste das so gehen:

copy *.csv outdir\out.csv

Oder auch

copy 1.csv +2.csv +3.csv +4.csv outdir\out.csv


Und das sh skript oben ist auch etwas sehr eigenartig. Der Sinn von cat ist doch schon selber das Aneinanderhängen. Also

cat 1.csv 2.csv 3.csv 4.csv >outdir/out.csv

Oder

cat *.csv >outdir/out.csv

Auch das ls *.csv in backticks ist etwas komisch. Man kann doch IIRC direkt schreiben:

for FILE in *.csv

???

Oder ist das jetzt irgendein Trick, falls keine .csv Datei exisitert?

Was ist überhaupt eine CSV Datei? Und warum sollte man die einfach so hintereinander hängen können?

Harleckin
2003-12-15, 16:08:10
Anhand 'ls *.csv' werden die Schleifendurchläufe begrenzt.
In "$FILE" stehen die jeweiligen Dateinamen, welcher nun innerhalb der Schleife mittels 'cat' miteinander verkettet werden.

Eminent
2003-12-17, 06:20:10
Also ne CSV-Datei ist eigentlich ne ganz einfache Textdatei mit anderer Endung. In ihr stehen z. B. Datensätze aus einer Datenbank in folgender Form:

Satz1Wert1;Satz1Wert2;Satz1Wert3;
Satz2Wert1;Satz2Wert2;Satz2Wert3;
usw.

Solche Dateien werden bei uns oft verwendet, da sie immer relativ klein (Speicherbedarf) sind.

Danke für eure Vorschläge.

Ich habe gestern selber auch n bisschen probiert und bin auf diese "Lösung" gekommen, ist das so auch OK?

(Die zu erstellende Datei soll den Inhalt aller CSVs haben und im gleichen Verzeichnis stehen, allerdings mit dem Namen: booking.dat)

Zuerst lösche ich die alte booking.dat mit:
del booking.dat

Dann wußte ich nicht wie ich mir eine "leer" Datei erzeugen soll und hab das mal so gemacht:
echo off>booking.dat

Anschließend nehme ich ne for-Schleife um alle Dateien mit Endung .csv zu verarbeiten. Dabei hatte ich gelesen, dass man mit Hilfe von COPY einfach Textdateien auch einfach zusammen hängen kann. Und da CSVs ja nichts anderes sind als Textdatein hab ich folgendes gemacht:
for %%x in (*.csv) do copy /b booking.dat+%%x booking.dat

Und zum Schluß sollen alle CSVs in nen Sicherungsordner verschoben werden, das hab ich mit MOVE gemacht:
move .\*.csv .\sicherung

Testen kann ich erst heute, aber könnte das denn so gehen?

DANKE

Tom Servo
2003-12-17, 07:51:03
Das mit dem Kopieren kann ein Problem sein, weil Quell- und Zieldatei identisch sind.

Besser wäre m.E. entweder die for Schleife ganz wegzulassen:


@echo off
DEL booking.dat
COPY *.csv booking.dat
IF NOT EXIST booking.dat echo > booking.dat


bzw.


@echo off
DEL booking.dat
ECHO > booking.dat
COPY *.csv booking.dat



Beim Windows wird der Platzhalter *.csv nicht von der Shell expandiert sondern das Copy Kommando bekommt ihn zu sehen, und weiss dann, das es die Dateien aneinander hängen soll.

Oder einfach statt des Copy Befehls den Type Befehl benutzen und dessen Ausgabe mittels Ausgabeumleitung >> an eine Datei anzuhängen. (>> hängt an; > erstellt immer eine neue Datei).


@echo off
DEL booking.dat
FOR %%x IN (*.csv) DO type %%x >>booking.dat
IF NOT EXIST booking.dat ECHO > booking.dat


Oder auch


@echo off
DEL booking.dat
TYPE *.csv >booking.dat


Hier wird eine leere booking.dat auch erzeugt, wenn es keine *.csv Dateien gibt. Fehlermeldungen werden durch ">>" oder ">" übrigens nicht umgelenkt. Du brauchst also nicht befürchten, dass diese damit in booking.dat landen, falls es keine .csv Datei gibt.


edit: Hier noch eine andere Version:


@echo off
IF EXIST booking.dat DEL booking.dat
IF EXIST *.csv (type *.csv >booking.dat) ELSE echo >booking.dat


oder auch


@echo off
IF EXIST booking.dat DEL booking.dat
echo >booking.dat
IF EXIST *.csv TYPE *.csv >booking.dat

Tom Servo
2003-12-17, 08:26:12
Bist du eigentlich sicher, dass du die Booking.Dat löschen willst? Vielleicht soll man auch die neuen Daten nur anhängen?

Habe auch mal ein komplettes Batch-File zum Testen geschrieben. Bin leider da auch nicht so der Experte und wollte deswegen lieber testen ob es überhaupt funktioniert. Folgendes scheint zu gehen:


@ECHO off
IF EXIST booking.dat DEL booking.dat
ECHO >booking.dat

IF NOT EXIST *.csv GOTO NOCSV

rem TYPE *.csv >booking.dat
COPY /B *.csv booking.dat

IF NOT EXIST sicherung MKDIR sicherung
MOVE *.csv sicherung

ECHO All done
GOTO END

:NOCSV
ECHO Nichts zu tun
GOTO END

:END

Eminent
2003-12-17, 12:29:18
Danke für eure Vorschläge! Werd gleich mal schauen was dann meinem Chefchen am besten passt! :-)

Und ja ich bin mir sicher, dass die booking.dat gelöscht werden soll. Die Datei wird einmal erzeugt und direkt im Anschluss dann genau einmal verwendet.

Und neue Daten dann nur anzuhängen wäre nicht gut, da es sich bei den Daten um eine Zeiterfassung für die Mitarbeiter handelt, die einmalig ins System eingelesen wird. Es würde zwar nichts machen, wenn die alten Daten mit drin stehen, weil die dann einfach nochmal (ein zweites mal) mit berechnet würden. Aber bei 1500 Angestellten und täglich bis zu 8 Buchungen pro Person würde sich das ganze nur unnötig in die Länge ziehen! :-)

Also nochmal danke für eure Hilfe, ich bin mir sicher, dass da was für mich dabei ist!!

Marcel
2003-12-20, 01:17:32
Original geschrieben von Tom Servo

@echo off
DEL booking.dat
TYPE *.csv >booking.dat


eh,

@echo off
DEL booking.dat
TYPE *.csv >>booking.dat

?
Oder ist das tatsächlich peng?

mapel110
2003-12-20, 03:55:17
ich kenn nur die obere variante.

Tom Servo
2003-12-20, 12:58:35
Original geschrieben von Marcel
eh,

@echo off
DEL booking.dat
TYPE *.csv >>booking.dat

?
Oder ist das tatsächlich peng?

Wie ist das mit dem Peng gemeint?

Falls es um > vs. >> geht. Das macht hier beides völlig dasselbe. Einen Unterschied gäbe es nur, wenn booking.dat vor dem Aufruf von TYPE existierten würde. Ein >> ist nicht nötig um die Dateien aneinanderzuhängen, weil das > nur die Standard-Ausgabe von Type umleitet, welche bereits aus den zusammengefügten Dateien besteht.

Das DEL booking.dat ist aber in meinem Beispiel redundant und könnte wegfallen.

Gebraucht würde es nur wenn das TYPE in der FOR Schleife wäre oder in einer IF Verzweigung.


btw: Man sollte vielleicht auch noch Type seine Geschwätzigkeit abgewöhnen, mit

TYPE *.csv >booking.dat 2>nul