Hallo Community, ich möchte eine Batch-Datei schreiben. Ich habe in mehreren Ordnern mehrere csv dateien, diese sollten in einer datei zusammengefügt werden?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Ich zerlege das mal in Teilaufgaben:


Du möchtest

  • für ein als Parameter anzugebendes Jahr
  • alle Monatsordner durchgehen und die darin befindlichen Dateien, deren Namen einem festen Benennungsschema folgen,
  • zu einer Datei zusammenfügen.


Dazu fällt mir folgendes ein:

  • Parameter einer Batchdatei kannst du mittels %1, %2... %9 nutzen.
  • Das Vorhandensein einer Datei kannst du mit "if not exist dateiname goto sprungmarke" behandeln. So kannst du eine Fehlermeldung ausgeben oder einen Monat überspringen, wenn dafür keine Daten vorliegen oder er noch nicht erreicht ist (wie z.B. jetzt noch der Oktober 2016).
  • Dateien zusammenfügen kannst du mittels
copy /b input1.csv+input2.csv+...+inputN.csv output.csv

Das /b bedeutet "binär", d.h. ohne Veränderung kopieren. Standardmodus wäre wahrscheinlich der "ASCII"-Modus, der aber unter manchen Bedingungen Probleme verursacht. Du musst eventuell ausprobieren, ob du diesen Parameter weglassen kannst.

  • Falls die input-Dateien nicht mit einem Zeilenumbruch enden, musst du jeweils zunächst temporäre Dateien erzeugen und daran explizit eine Leerzeile anhängen, da sonst die erste Zeile einer Datei direkt an die letzte Zeile der vorherigen angehängt wird:
copy /b input1.csv %TEMP%\input1.csv
echo.>>%TEMP%\input1.csv




Wasemack 
Fragesteller
 26.09.2016, 15:04

Die Dateien haben alle einen fortführenden Namen, jedoch in manchen Ordnern 10 und anderen 100, deswegen bräuchte Ich eine Batch, die die Ordner einem nach dem anderen durchgeht, und alle CSV dateien in einem zusammenfügt, den einzigen input den ich machen will, sollte dann das ändern der Verzeichnisse sein, wenn ich das Jahr ändere, mir geht es hauptsächlich um eine Schleife, die von allein alle dateien zusammenfügt und dann den nächsten Ordner erledigt, es sollte eine Batch sein, welche einer Person zur Verfügung gestellt wird, diese einfach nur auszuführen ist und dann eine csv daraus wird

0
Trilobit  26.09.2016, 19:00
@Wasemack

Zunächst mal danke für den Stern.

-

Zum Thema Schleife:

Du kannst eventuell den Befehl "for" nutzen.

for %a in (*.*) do echo %a
for /d %a in (*) do echo %a


Der erste Befehl gibt die Namen aller Dateien im aktuellen Ordner aus, der zweite die aller Unterordner.

(In Batchdateien musst du bei ansonsten unveränderter Syntax die Prozentzeichen verdoppeln, hier also %%a anstatt nur %a.)

In meinem kurzen Versuch eben wurden die Dateinamen alphabetisch sortiert. (Ich weiß allerdings nicht, ob "for" die Reihenfolge stets beachtet - falls nicht, können die Ergebnisdateien, also in deinem Fall die zusammengeklebten Meldungen und Kategorien, in unterschiedlicher Reihenfolge ihrer jeweiligen Quelldateien zusammengesetzt werden. Dann wäre "for" - zumindest in der hier beschriebenen Weise - nicht für den gewünschten Zweck anwendbar.)

Eine alphabetische Sortierung der Dateinamen hieße, dass eine Datei "10.csv" vor "2.csv" verarbeitet würde. Falls du die Ergebnis-CSV-Datei als reine Datenbank verwendest, die du dann mit SVERWEIS oder Pivottabellen weiter auswertest, wäre das aber sicher akzeptabel.


Ich gehe außerdem davon aus, dass du ein Unterprogramm brauchen wirst:
- Das "Hauptprogramm" wird mit dem Jahr als Parameter gerufen, wechselt in den entsprechenden Ordner und ruft für jeden Monat das Unterprogramm auf (for /d).
- Das "Unterprogramm" soll nur die Dateien eines Monats verarbeiten (for).

Am einfachsten verwendest du dafür eine weitere Batchdatei, die vom "Hauptprogramm"-Batch mit geeigneten Parametern aufgerufen wird.

1

Müsste eine Batchdatei sein, da sie wahrscheinlich auf mehreren windows pcs eingesetzt wird, perl ist ja nur auf linux vorinstalliert

Hi, hier ist auch ein David. Ich kennt mich mit diesem Windows Batch Müll nicht aus ( ;-) ) aber mit einem Perl Skript würde das schnell und einfach gehen :)