Zeilen aus Textdatei auslesen und modifiziert in eine neue Textdatei schreiben
Hallo allerseits,
da ich neu bin grüsse ich zuerst alle MItglieder.
Nun zu meine Frage. Ich möcte gerne ein Batchprgramm schreiben (eine Datei "xxx.bat") der folgendes machen soll.
In eine Quell-Textdatei steht folgender Inhalt
CL08001407
CL08002715
CL08002913
CL08003313
Der Batch soll mir diese vier Zeilen bzw. alle vorhandene Zeilen auslesen und wie folgt in die erste Zeile eines Ziel-TextDatei schreiben
CL08001407|CL08002715|CL08002913|CL08003313
Darf dabei die QuellDatei und die Zieldatei geöffnet sein? Oder müssen beide geschlossen sein?
Will noch hindeuten das ich in Sachen Batchprogrmmierung sehr neu bin. Darum wär für mich hilfreich den möglichen Lösungs-Code von A-Z zu erhalten^^
da ich neu bin grüsse ich zuerst alle MItglieder.
Nun zu meine Frage. Ich möcte gerne ein Batchprgramm schreiben (eine Datei "xxx.bat") der folgendes machen soll.
In eine Quell-Textdatei steht folgender Inhalt
CL08001407
CL08002715
CL08002913
CL08003313
Der Batch soll mir diese vier Zeilen bzw. alle vorhandene Zeilen auslesen und wie folgt in die erste Zeile eines Ziel-TextDatei schreiben
CL08001407|CL08002715|CL08002913|CL08003313
Darf dabei die QuellDatei und die Zieldatei geöffnet sein? Oder müssen beide geschlossen sein?
Will noch hindeuten das ich in Sachen Batchprogrmmierung sehr neu bin. Darum wär für mich hilfreich den möglichen Lösungs-Code von A-Z zu erhalten^^
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 108234
Url: https://administrator.de/forum/zeilen-aus-textdatei-auslesen-und-modifiziert-in-eine-neue-textdatei-schreiben-108234.html
Ausgedruckt am: 29.04.2025 um 10:04 Uhr
7 Kommentare
Neuester Kommentar
Hallo MaxUser und willkommen im Forum!
- Sollen nur die 4 Werte in die erste Zeile, oder tatsächlich alle Zeilen zu einer einzigen zusammengefasst werden?
- Wenn nur die angesprochenen 4 Zeilen zu einer zusammngefasst werden sollen: Woran sind diese Zeilen zu erkennen? Beginnen Sie etwa als einzige mit "CL"?
- Und noch eine Frage: sind es immer genau 4 Zeilen?
Grüße
bastla
Der Batch soll mir diese vier Zeilen bzw. alle vorhandene Zeilen auslesen und wie folgt in die erste Zeile eines Ziel-TextDatei schreiben
Diese Anforderung solltest Du noch etwas konkretisieren:- Sollen nur die 4 Werte in die erste Zeile, oder tatsächlich alle Zeilen zu einer einzigen zusammengefasst werden?
- Wenn nur die angesprochenen 4 Zeilen zu einer zusammngefasst werden sollen: Woran sind diese Zeilen zu erkennen? Beginnen Sie etwa als einzige mit "CL"?
- Und noch eine Frage: sind es immer genau 4 Zeilen?
Darf dabei die QuellDatei und die Zieldatei geöffnet sein?
Soll die Zieldatei denn nicht neu erstellt, sondern eine bereits vorhandene Datei verändert werden?Grüße
bastla
Hallo MaxUser!
Das Zusammenfassen könnte etwa so gehen:
Falls Du vor der zusammengefassten Zeile noch eine Leerzeile erhältst, die Batchzeile 6 weglassen.
Noch ein Hinweis: Sonderzeichen (wie etwa "&", "<", ...) könnten Probleme bereiten (oder müssten zumindest gesondert behandelt werden).
Grüße
bastla
P.S.: Eine Beschreibung des Ablaufes kann ich erst später am Tag nachreichen ...
Das Zusammenfassen könnte etwa so gehen:
@echo off & setlocal
set "Quelle=D:\Quellordner\Quelldatei.txt"
set Zeile=
for /f "usebackq delims=" %%i in ("%Quelle%") do call :ProcessLine "%%i"
>>"%Quelle%" echo\
>>"%Quelle%" echo %Zeile:~2%
goto :eof
:ProcessLine
set "Zeile=%Zeile%^|%~1"
goto :eof
Noch ein Hinweis: Sonderzeichen (wie etwa "&", "<", ...) könnten Probleme bereiten (oder müssten zumindest gesondert behandelt werden).
Grüße
bastla
P.S.: Eine Beschreibung des Ablaufes kann ich erst später am Tag nachreichen ...
Hallo MaxUser!

Wie versprochen noch einige Anmerkungen zum Code:
und
habe ich hier schon mal kurz beschrieben ...
Eigentlich sollte es die Variable %Zeile% zu Beginn des Batches ohnehin nicht geben - jetzt existiert diese aber ganz sicher nicht
(wird durch diese "Zuweisung" gelöscht).
Zu den Inhalten dieser Zeile findest Du ebenfalls an anderer Stelle einige Anmerkungen - Sinn dieser Zeile ist es, jede Zeile einzeln auszulesen und an das Unterprogramm ":ProcessLine" am Stück (daher unter Anführungszeichen zu setzen) weiter zu reichen.
Diese beiden Zeilen schreiben eine Leerzeile sowie den Inhalt der Variablen %Zeile% nach dem zweiten Zeichen jeweils an das Ende der Quelldatei (">>" bedeutet "Anfügen", mit ">" würde eine neue Datei erstellt = die bestehende überschrieben). Da die Variable %Zeile% als erste Zeichen "^|" (vom Hinzufügen der ersten Zeile) enthält, kann die Ausgabe erst nach Position 2 erfolgen.
Damit wird ein Batch (und auch ein Unterprogramm kann als "Batch" im "Batch" betrachtet werden - siehe unten) beendet (stellt sicher, dass das danach folgende Unterprogramm nicht ein weiteres - und damit überflüssiges - Mal ausgeführt wird und ist somit die Stelle, an welcher der gesamte Batch beendet wird.
Dieses Unterprogramm wird für jede Zeile der Quelldatei aufgerufen und stellt eigentlich einen eigenen Batch dar - deshalb kann es auch den (ersten und einzigen) beim Aufruf übergebenen Parameter "Zeileninhalt" als %1 übernehmen.
Verarbeitet wird dieser Parameter, indem an den aktuellen Inhalt der Variablen %Zeile% (beim ersten Aufruf ist diese noch nicht vorhanden und daher "leer") zunächst ein "|" und danach die übergebene Zeile angefügt wird. Mit "%~1" anstelle von "%1" wird der Parameter ohne die umgebenden Anführungszeichen angesprochen.
Mit der Schreibweise "^|" wird das Pipe-Sysmbol "maskiert", was dem Interpreter mitteilt, dass es als gewöhnliches Zeichen und nicht als Verbindung zur nächsten Anweisung zu verstehen ist.
"goto :eof" hat die schon oben beschriebene Funktion, das Ende dieses Programmteiles (und damit hier - in einem Unterprogramm - die Anweisung zum Rücksprung in das Hauptprogramm -konkret in die "for"-Schleife - zu signalisieren). An dieser Stelle des Batches könnte es auch weg gelassen werden, da nach der letzten Batchzeile ein automatisches "goto :eof" ausgeführt wird - da es aber nicht schadet, schreibe ich es sicherheitshalber grundsätzlich hin, um es im Fall des Falles unterhalb das Platzieren weiterer Programmteile zu ermöglichen.
Grüße
bastla
Jetzt funktioniert es wunderbar.
Freut mich. Wie versprochen noch einige Anmerkungen zum Code:
@echo off & setlocal
set "Quelle=D:\Quellordner\Quelldatei.txt"
set Zeile=
for /f "usebackq delims=" %%i in ("%Quelle%") do call :ProcessLine "%%i"
>>"%Quelle%" echo\
>>"%Quelle%" echo %Zeile:~2%
goto :eof
:ProcessLine
set "Zeile=%Zeile%^|%~1"
goto :eof
Verarbeitet wird dieser Parameter, indem an den aktuellen Inhalt der Variablen %Zeile% (beim ersten Aufruf ist diese noch nicht vorhanden und daher "leer") zunächst ein "|" und danach die übergebene Zeile angefügt wird. Mit "%~1" anstelle von "%1" wird der Parameter ohne die umgebenden Anführungszeichen angesprochen.
Mit der Schreibweise "^|" wird das Pipe-Sysmbol "maskiert", was dem Interpreter mitteilt, dass es als gewöhnliches Zeichen und nicht als Verbindung zur nächsten Anweisung zu verstehen ist.
"goto :eof" hat die schon oben beschriebene Funktion, das Ende dieses Programmteiles (und damit hier - in einem Unterprogramm - die Anweisung zum Rücksprung in das Hauptprogramm -konkret in die "for"-Schleife - zu signalisieren). An dieser Stelle des Batches könnte es auch weg gelassen werden, da nach der letzten Batchzeile ein automatisches "goto :eof" ausgeführt wird - da es aber nicht schadet, schreibe ich es sicherheitshalber grundsätzlich hin, um es im Fall des Falles unterhalb das Platzieren weiterer Programmteile zu ermöglichen.
Grüße
bastla