Batch ausführen über bestimmte Dateien

ingo750

Ensign
Registriert
Juli 2010
Beiträge
183
Hallo zusammen.

folgende Ausgangslage; in einem Ordner liegen viele csv Dateien. Diese csv Dateien sollen in (jeweils) eine csv Datei zusammengeführt werden.

Das kann man direkt im Internet machen über diese Homepage machen (Datenschutz...), jemand hat aber auch einen Batch dafür geschrieben.

Den Batch
_______________________
@echo off & setlocal
set "Ordner=W:\Scripts"
set "Sammel=W:\Scripts\DeineSammeldatei.csv"

pushd "%Ordner%"
if exist "%Sammel%" del "%Sammel%"
for %%i in (*.csv) do if not exist "%Sammel%" for /f "usebackq delims=" %%z in ("%%i") do if not exist "%Sammel%" echo %%z>"%Sammel%"
for /f "delims=" %%i in ('dir /b /od *.csv') do more +1 "%%i">>"%Sammel%"

popd
_________________________

habe ich übernommen und angepasst, läuft auch soweit. NUN die Frage:

Mit dem Batch werden alle Dateien im Verzeichnis zusammengeführt und in einem neuen Verzeichnis ausgegeben.
Ich habe in dem Verzeichnis aber mehrere Typen csv Dateien liegen, die eindeutig durch einen Teil des Dateinamens identifiziert werden können. Wie müsste der Batch angepasst werden, dass er nur die csv Dateien zusammenführt, in deren Dateinamen z.B. der Teil "Wert" vorkommt?
Komme an der Stelle derzeit nicht weiter, klar man könnte die Typen manuell separieren und per einzelnem Batch behandeln lassen, aber es wäre halt komfortabler, wenn es in einem Rutsch läuft.

Gruss
 
Wenn ich das richtig lese, jeweils die (*.csv) durch dein neues Muster ersetzen. * ist ein Platzhalter für alle Zeichen, je nachdem wie deine csvs bennant sind also davor oder danach

angenommen deine dateien sind
Code:
bericht1_1234567890_1.csv
bericht1_1234567890_2.csv
bericht2_1234567890_1.csv
bericht2_1234567890_2.csv

In dem Fall bräuchtest du 2 schleifen, eine für "Bericht1" und einen für "Bericht2". Gesucht werden müsste dann nach bericht1_*.csv bzw. bericht2_*.csv. Natürlich müssen die Sammeldateien entsprechend unterschiedlich sein weil sie sich sonst überschreiben.

Du kannst entweder getrennte Batch Dateien schreiben, oder für jeden Bericht eine eigene Batch Datei. Ich persönlich würde getrennte Batchdateien nehmen, da man dann mal eine Batch gezielt aussetzen kann ohne am Code rumfummeln zu müssen.
 
Worin unterscheiden sich die beiden Gruppen von CSVs denn genau?
Man könnte zB auch am Anfang per xcopy die entsprechenden Dateien in einen 'working' Ordner hinkopieren und dort dann auf allen Arbeiten erledigen und danach wieder aufräumen.
 
Ich tippe mal auf die Indexzeile. Wenn man die Dateien anhand der Indexzeile in mehrere Unterverzeichnisse sortiert und anschließend zusammenfasst, sollte es immer passen.
 
Die zusammenzuführenden Dateien sind nach dem Schema aufgebaut:

xxx_123_Werte.csv
xxx_123_Beispiel.csv
xxx_123_Test.csv
yyy_456_Werte.csv
yyy_456_Beispiel.csv
yyy_456_Test.csv
... und so weiter - insgesamt mehrere Dutzend.

Ich habe für die Sammeldatei Werte, Beispiel, Test jeweils eine Schleife gebaut. Diese Sammeldateien werden auch angelegt - es steht nur überall das gleiche drin, weil ich nicht weiss, wie ich den Filter *Werte.csv (und äquivalent für Beispiel und Test) jeweils in die Schleifen des Batch einbringe.
Derzeit schreibt er halt alle Dateien zusammen in jede Sammeldatei.
Die Indexzeile wird auch korrekt nur aus der jeweils ersten eingelesenen Datei übernommen und danach die Werte korrekt untereinander zusammengeschrieben.

@mihawk90
Wie fügt man denn diesen Kasten in einen Beitrag? Hatte das in anderen Threads auch schon gesehen...
 
PHP:
@echo off & setlocal
set "Ordner=W:\Scripts"
set "SammelWerte=W:\Scripts\GesammelteWerte.csv"
set "SammelBeispiel=W:\Scripts\GesammelteBeispiel.csv"
set "SammelTest=W:\Scripts\GesammelteTest.csv"

pushd "%Ordner%"

if exist "%SammelWerte%" del "%SammelWerte%"
for %%i in (*_Werte.csv) do if not exist "%SammelWerte%" for /f "usebackq delims=" %%z in ("%%i") do if not exist "%SammelWerte%" echo %%z>"%SammelWerte%"
for /f "delims=" %%i in ('dir /b /od *_Werte.csv') do more +1 "%%i">>"%SammelWerte%"

if exist "%SammelBeispiel%" del "%SammelBeispiel%"
for %%i in (*_Beispiel.csv) do if not exist "%SammelBeispiel%" for /f "usebackq delims=" %%z in ("%%i") do if not exist "%SammelBeispiel%" echo %%z>"%SammelBeispiel%"
for /f "delims=" %%i in ('dir /b /od *_Beispiel.csv') do more +1 "%%i">>"%SammelBeispiel%"

if exist "%SammelTest%" del "%SammelTest%"
for %%i in (*_Test.csv) do if not exist "%SammelTest%" for /f "usebackq delims=" %%z in ("%%i") do if not exist "%SammelTest%" echo %%z>"%SammelTest%"
for /f "delims=" %%i in ('dir /b /od *_Test.csv') do more +1 "%%i">>"%SammelTest%"

popd
 
Danke! Bin noch unterwegs, probiere das aber nachher aus und melde mich.
Ergänzung ()

@vander
Danke, Problem gelöst - läuft alles wie gewünscht!

Abschliessend und erst im Nachgang auffallend eine "wäre nice to have" Frage. Die Output-Dateien sind mit GesammelteWerte.csv, GesammelteBeispiel.csv und GesammelteTest.csv fest benannt.
Könnte man diese am Ende noch umbenennen indem ein Teil einer csv-Input-Datei (in diesem Fall das Datum) vorangestellt wird?
Konkret also Übernahme aus einer csv Datei YYYY-MM-DD-xxx_Werte.csv (wobei MM auch einstellig ausfällt) zu YYYY-MM-DD_GesammelteWerte.csv

Schönen Sonntag noch.
 
ingo750 schrieb:
@mihawk90
Wie fügt man denn diesen Kasten in einen Beitrag? Hatte das in anderen Threads auch schon gesehen...

mit [ code][ /code] (ohne leerzeichen) um den Text


Was das Datum angeht... theoretisch ja, aber nicht allzu simpel (gibt leider keine funktion um direkt das datum auszugeben). Ich habs mal in einer Batch eingebaut (tägliche MySQL Backups), aber da ich gerade nicht zuhause bin kann ichs dir gerade nicht geben.
 
Irgendwann ist dann doch der Punkt gekommen, wo man besser eine moderne Programmiersprache verwendet...
ich würds in Python machen (was ich auch generell sehr sinnvoll zu lernen finde) und andere empfehlen für sowas evtl Powershell
 
@mihawk u. kuddlmuddl

Danke für die Code-Aufklärung und Hinweis. Ich hab´ das mit dem Datum gestern hinbekommen mit paste, copy und etwas ausprobieren und anpassen.
Programmierung lernen wäre zwar grundsätzlich sinnvoll, aber dafür brauche ich es doch zu selten. Bin aber immer wieder erstaunt, was manche Leute so zusammenzaubern können.

Gruss
 
Zurück
Oben