Zeilenweises Verarbeiten mehrerer Flatfiles in einem Batch-Skript mit Bordmitteln (Windows Shell)
Hallo liebe Gemeinde,
ich bin neu hier und wende mich mit einem Problem an euch, das ich einfach nicht in den Griff bekomme. Es sieht folgendermaßen aus:
Es soll eine automatische Verarbeitung mehrerer Flatfiles (ASCII) in einem definierten Verzeichnis stattfinden. Die Anzahl der Dateien innerhalb des Verzeichnisses sind im Vorfeld nicht bekannt, richten sich aber nach einem bestimmten Muster (TDWH*.*). Die Dateien werden täglich geliefert.
Mein Problem ist nun Folgendes: im Dateinamen der Flatfiles befindet sich eine Information, die ich in jede Zeile des entsprechenden Files an den Anfang (oder das Ende) stellen will. Ich habe schon von mehreren Seiten gehört, dass dies durch ein VBScript durchaus elegant machbar ist. Meine Herausforderung ist die, das mit den normalen Bordmitteln einer Windows Server 2003 - Installation hinzubekommen. Es gibt in dieser Umgebung keine PowerShell oder sonstige Tools, die extra installiert worden sind, d.h. sed-Befehle (usw.) sind nicht möglich.
Im Anschluß an die Bearbeitung dieser Dateien soll der (bearbeitete) Inhalt aller Dateien in eine neue Datei geschrieben werden, die dann zur Verarbeitung in ein DWH weiter gereicht wird.
Ich habe in diesem Forum schon ein paar Anleitungen durchgelesen, aber leider keine Lösung gefunden. Gibt es hier in diesem Kreise jemand, der mir an der Stelle weiter helfen kann?
Vielen Dank schon mal im Voraus!
Gruss,
-jenzz-
ich bin neu hier und wende mich mit einem Problem an euch, das ich einfach nicht in den Griff bekomme. Es sieht folgendermaßen aus:
Es soll eine automatische Verarbeitung mehrerer Flatfiles (ASCII) in einem definierten Verzeichnis stattfinden. Die Anzahl der Dateien innerhalb des Verzeichnisses sind im Vorfeld nicht bekannt, richten sich aber nach einem bestimmten Muster (TDWH*.*). Die Dateien werden täglich geliefert.
Mein Problem ist nun Folgendes: im Dateinamen der Flatfiles befindet sich eine Information, die ich in jede Zeile des entsprechenden Files an den Anfang (oder das Ende) stellen will. Ich habe schon von mehreren Seiten gehört, dass dies durch ein VBScript durchaus elegant machbar ist. Meine Herausforderung ist die, das mit den normalen Bordmitteln einer Windows Server 2003 - Installation hinzubekommen. Es gibt in dieser Umgebung keine PowerShell oder sonstige Tools, die extra installiert worden sind, d.h. sed-Befehle (usw.) sind nicht möglich.
Im Anschluß an die Bearbeitung dieser Dateien soll der (bearbeitete) Inhalt aller Dateien in eine neue Datei geschrieben werden, die dann zur Verarbeitung in ein DWH weiter gereicht wird.
Ich habe in diesem Forum schon ein paar Anleitungen durchgelesen, aber leider keine Lösung gefunden. Gibt es hier in diesem Kreise jemand, der mir an der Stelle weiter helfen kann?
Vielen Dank schon mal im Voraus!
Gruss,
-jenzz-
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 111227
Url: https://administrator.de/forum/zeilenweises-verarbeiten-mehrerer-flatfiles-in-einem-batch-skript-mit-bordmitteln-windows-shell-111227.html
Ausgedruckt am: 01.05.2025 um 06:05 Uhr
8 Kommentare
Neuester Kommentar
Moin -jenzz-,
willkommen im Forum.
Für die Wahl eines geeigneten Werkzeugs wäre es noch sinnvoll zu wissen, welcher Art der Inhalt der Flatfiles sein mag (mit/ohne Umlauten, Sonderzeichen, Zeichencode), wie die Namens-Konventionen für die neue Gesamt-Datei sein sollen und ob/wie die Einzel-Import-Flatfiles nach erfolgreicher Transformation behandelt werden sollen.
Die Krönung und der heimliche Wunschtraum eines jeden Fricklers hier im Forum wären natürlich 3 oder 4 Beispieldatenzeilen...
Grüße
Biber
willkommen im Forum.
Für die Wahl eines geeigneten Werkzeugs wäre es noch sinnvoll zu wissen, welcher Art der Inhalt der Flatfiles sein mag (mit/ohne Umlauten, Sonderzeichen, Zeichencode), wie die Namens-Konventionen für die neue Gesamt-Datei sein sollen und ob/wie die Einzel-Import-Flatfiles nach erfolgreicher Transformation behandelt werden sollen.
Die Krönung und der heimliche Wunschtraum eines jeden Fricklers hier im Forum wären natürlich 3 oder 4 Beispieldatenzeilen...
Grüße
Biber
... und wenn Du dann auch noch das Geheimnis um "eine Information" im Dateinamen lüftest, sollte sich das per Batch (mit oder ohne VBScript-Unterstützung) machen lassen ...
Soll die ominöse "Information" übrigens tatsächlich in die einzelnen Dateien geschrieben werden, oder ev doch nur in den Zeilen der Gesamt-Datei aufscheinen?
Grüße
bastla
P.S.: Willkommen auch von mir ...
Soll die ominöse "Information" übrigens tatsächlich in die einzelnen Dateien geschrieben werden, oder ev doch nur in den Zeilen der Gesamt-Datei aufscheinen?
Grüße
bastla
P.S.: Willkommen auch von mir ...
Hallo -jenzz-!
Batch und Unicode ist keine sooo gute Kombination - daher etwas Unterstützung durch ein anderes "Hausmittel", nämlich VBScript:
Bitte die Pfade in den Zeilen 2 und 4 anpassen (wobei Zeile 2 nicht mit einem "\" enden darf, auch wenn es ein Root-Verzeichnis wäre - daher zB für "D:\" nur "D:" schreiben) ...
Das Löschen der Ausgangsdateien und ev weitere nach der Erzeugung der Gesamt-Datei anfallende Arbeitsschritte können im Batch unmittelbar vor der Zeile "::Ende des Hauptprogrammes" eingefügt werden.
Nur als Demo dabei ist in Zeile 21 der Batchcode, mit dem die Verarbeitung im einfachsten Fall (Ausgangsdateien nicht Unicode, keine Sonderzeichen "&<>|" oder eine ungerade Anzahl von Anführungszeichen enthalten ) erfolgen könnte - falls Du testen willst, einfach zwei Unicode-Dateien per
"umspeichern", die Doppelpunkte vor der Zeile 21 entfernen, die Zeile 19 ("cscript ...") durch vorangestellte "::" deaktivieren und den Batch auf die Dateien im Ordner "D:\FlatfilesASCII" loslassen (indem dieser in Zeile 2 eingetragen wird).
Noch eine Frage: Welche Dateigröße (Zeilenanzahl) erreichen eigentlich die einzelnen Ausgangsdateien?
Grüße
bastla
Batch und Unicode ist keine sooo gute Kombination - daher etwas Unterstützung durch ein anderes "Hausmittel", nämlich VBScript:
@echo off & setlocal
set "Verz=D:\Flatfiles"
set "Maske=TDWH*.*"
set "Gesamt=D:\TDWH.DAT"
set "AI=%temp%\AddInfo.vbs"
> %AI% echo Set args=WScript.Arguments:Set fso=CreateObject("Scripting.FileSystemObject")
>>%AI% echo Set FI=fso.OpenTextFile(args(0),,,True):Set FO=fso.OpenTextFile(args(1),8,True,True)
>>%AI% echo Do Until FI.AtEndOfStream:FO.WriteLine FI.ReadLine^&args(2):Loop:FO.Close:FI.Close
if exist "%Gesamt%" del "%Gesamt%"
for %%i in ("%Verz%\%Maske%") do call :ProcessFile "%%i"
::Ende des Hauptprogrammes
goto :eof
:ProcessFile
for /f "delims=." %%a in ("%~nx1") do set "DName=%%a"
set "ReNr=%DName:~4%"
cscript //nologo %AI% %1 "%Gesamt%" "%ReNr%"
::ohne Unicode
::for /f "usebackq delims=" %%a in (%1) do >>"%Gesamt%" echo %%a %ReNr%
goto :eof
Das Löschen der Ausgangsdateien und ev weitere nach der Erzeugung der Gesamt-Datei anfallende Arbeitsschritte können im Batch unmittelbar vor der Zeile "::Ende des Hauptprogrammes" eingefügt werden.
Nur als Demo dabei ist in Zeile 21 der Batchcode, mit dem die Verarbeitung im einfachsten Fall (Ausgangsdateien nicht Unicode, keine Sonderzeichen "&<>|" oder eine ungerade Anzahl von Anführungszeichen enthalten ) erfolgen könnte - falls Du testen willst, einfach zwei Unicode-Dateien per
type D:\Flatfiles\Unicode-Datei>D:\FlatfilesASCII\ASCII-Datei
Noch eine Frage: Welche Dateigröße (Zeilenanzahl) erreichen eigentlich die einzelnen Ausgangsdateien?
Grüße
bastla
Hallo -jenzz-!
Kein Problem - ich war nur vorsichtshalber von sehr großen Dateien ausgegangen und verarbeite daher die Ausgangsdateien jeweils zeilenweise, anstatt sie gleich als Ganzes in den Speicher zu holen - der Performance-Unterschied würde aber vermutlich ohnehin nicht wirklich ins Gewicht fallen.
Grüße
bastla
Kein Problem - ich war nur vorsichtshalber von sehr großen Dateien ausgegangen und verarbeite daher die Ausgangsdateien jeweils zeilenweise, anstatt sie gleich als Ganzes in den Speicher zu holen - der Performance-Unterschied würde aber vermutlich ohnehin nicht wirklich ins Gewicht fallen.
Grüße
bastla