Zeilen sequentiell aus 3 Textdateien auslesen
Ist es möglich aus 3 Textdateien sequentiell Zeilen auszulesen und die Strings in eine andere zu schreiben?
Ich habe drei Textdateien, die jeweils die identische anzahl an zeilen besitzen. die drei sollen so zusammengefügt werden, dass z.b. jeweils die erste zeile der 3 Dateien, zur ersten zeile der neuen txt zusammengefügt werden, dann die nächste usw.
Das auslesen von einer Textdatei und zusammenfügen von 3 hintereinanderfolgenden zeilen zu einer, habe ich hier schon beantwortet bekommen:
, aber das schaff ich nun mal nicht ohne hilfe. Kann ich auf oben genannten code aufsetzen?
Ich hab keine idee ...
[Edit Biber] Formatierung auf gesetzt [/Edit]
Ich habe drei Textdateien, die jeweils die identische anzahl an zeilen besitzen. die drei sollen so zusammengefügt werden, dass z.b. jeweils die erste zeile der 3 Dateien, zur ersten zeile der neuen txt zusammengefügt werden, dann die nächste usw.
Das auslesen von einer Textdatei und zusammenfügen von 3 hintereinanderfolgenden zeilen zu einer, habe ich hier schon beantwortet bekommen:
@echo off
echo AREA Name DESC>sortiert.txt
set line=
set /a count=0
FOR /f "delims=" %%f IN ('type "MODULES_1.txt"') DO call :ProcessLine "%%f")
(echo %line%)>>sortiert.txt
goto :eof
:ProcessLine
if %count%==0 goto :NewLine
set /a count+=1
If %count% GTR 3 goto :NewLine
set "line=%line% %~1"
goto :eof
:NewLine
If %count% neq 0 (echo %line%)>>sortiert.txt
set "line=%~1"
set /a count=1
goto :eof
, aber das schaff ich nun mal nicht ohne hilfe. Kann ich auf oben genannten code aufsetzen?
Ich hab keine idee ...
[Edit Biber] Formatierung auf gesetzt [/Edit]
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 51083
Url: https://administrator.de/forum/zeilen-sequentiell-aus-3-textdateien-auslesen-51083.html
Ausgedruckt am: 17.05.2025 um 11:05 Uhr
11 Kommentare
Neuester Kommentar
Hallo wickie666!
Das wird so nicht gehen.
Vielleicht erklärst Du kurz, was Du eigentlich vor hast (ob der Vorgang regelmäßig und vollautomatisch ablaufen soll, und auch, was mit der Ergebnisdatei geschehen soll - werden zB Trennzeichen wie ";" oder "," benötigt, ...). Weiters nicht ganz unwichtig ist der Inhalt der Ausgangsdateien - etwa, ob sie Anführungszeichen enthalten.
Grüße
bastla
Kann ich auf oben genannten code aufsetzen?
Vielleicht erklärst Du kurz, was Du eigentlich vor hast (ob der Vorgang regelmäßig und vollautomatisch ablaufen soll, und auch, was mit der Ergebnisdatei geschehen soll - werden zB Trennzeichen wie ";" oder "," benötigt, ...). Weiters nicht ganz unwichtig ist der Inhalt der Ausgangsdateien - etwa, ob sie Anführungszeichen enthalten.
Grüße
bastla
Moin wickie666,
klar kannst Du auf die im anderen Beitrag geposteten Skizzen aufsetzen.
Da sich bis jetzt aber nicht erkennen lässt, was denn genau Dein Plan bzw. der Sinn vons Ganze sein soll, verzichte ich jetzt mal auf jegliche Flexibitität der Lösung und gehe davon aus:
- es existieren im aktuellen Verzeichnis drei Dateien Modules_1.txt, Modules_2.txt, Modules_3.txt
- die Einzelzeilen werden einfach durch ein Leerzeichen getrennt aneinandergereiht
- das gemergete Ergebnis wird auf den Bildschirm ausgegeben - wie Du es in eine Datei umlenken kannst, steht ja im Parallelthread.
Inhalte der Datei Modules_1.txt (Modules_2 und ~_3 ist analog)
Aufruf am CMD-Prompt:
Den anderen Thread schliesse ich mal und setz ihn auf "gelöst".
Wäre nett, wenn Du erstmal Deinen Plan erläuterst... wieso und woher gibt es denn drei Modules_X.txt mit exakt gleicher Zeilenanzahl und wozu müssen die zusammengemanscht werden? Just for educational purposes?
Gruss
Biber
[Edit] Moin bastla,
sorry hatte Dich nicht gesehen, als ich mit Tippseln anfing...
Aber den tieferen Sinn der Manscherei verstehe ich genausowenig wie Du..
[/Edit]
klar kannst Du auf die im anderen Beitrag geposteten Skizzen aufsetzen.
Da sich bis jetzt aber nicht erkennen lässt, was denn genau Dein Plan bzw. der Sinn vons Ganze sein soll, verzichte ich jetzt mal auf jegliche Flexibitität der Lösung und gehe davon aus:
- es existieren im aktuellen Verzeichnis drei Dateien Modules_1.txt, Modules_2.txt, Modules_3.txt
- die Einzelzeilen werden einfach durch ein Leerzeichen getrennt aneinandergereiht
- das gemergete Ergebnis wird auf den Bildschirm ausgegeben - wie Du es in eine Datei umlenken kannst, steht ja im Parallelthread.
::----------snipp Merge3Modules2One.bat
@echo off &setlocal
findstr /n . Modules_1.txt modules_2.txt modules_3.txt|sort /+14>%temp%\input.txt
set "line="
set /a count=0
FOR /f "tokens=3 delims=:" %%f IN ('type "%temp%\input.txt"') DO call :ProcessLine "%%f"
if "%line%" NEQ "" (echo %line%)
del %temp%\input.txt
goto :eof
:ProcessLine
set "line=%line% %~1"
set /a count+=1
set /a modrest=count%%3
If %modrest%==0 (
(echo %line:~1%)
set "Line="
)
goto :eof
::----------Merge3Modules2One.bat
Modules_1 erste zeile
Modules_1 zeile zwei
Modules_1 noch eine Zeile
Modules_1 vierte zeile - reicht zum testen
>Merge3Modules2One.bat
Modules_1 erste zeile Modules_2 erste zeile Modules_3 erste zeile
Modules_1 zeile zwei Modules_2 zeile zwei Modules_3 zeile zwei
Modules_1 noch eine Zeile Modules_2 noch eine Zeile Modules_3 noch eine Zeile
Modules_1 vierte zeile - reicht zum testen Modules_2 vierte zeile - reicht zum testen Modules_3 vierte zeile - reicht zum testen
Den anderen Thread schliesse ich mal und setz ihn auf "gelöst".
Wäre nett, wenn Du erstmal Deinen Plan erläuterst... wieso und woher gibt es denn drei Modules_X.txt mit exakt gleicher Zeilenanzahl und wozu müssen die zusammengemanscht werden? Just for educational purposes?
Gruss
Biber
[Edit] Moin bastla,
sorry hatte Dich nicht gesehen, als ich mit Tippseln anfing...
Aber den tieferen Sinn der Manscherei verstehe ich genausowenig wie Du..
[/Edit]
Hallo wickie666!
Anyhow - ein etwas weniger "morgendlicher" Ansatz zu Biber's Vorlage:
Aufruf mit:
Grüße
bastla
[Edit] In Zeile for %%d in (%*) do call :ProcessFile "%%~d" ~ ergänzt [/Edit]
Danach behellige ich euch auch nicht mehr 
"Behelligung" ist nicht das Thema (es zwingt mich ja niemand, Dir zu antworten), sondern zB die Frage, ob nicht vielleicht die Verwendung eines anderen Werkzeugs (etwa VBScript) oder ein anderer Lösungsweg (Zusammenfügen in Excel?) vorteilhafter wäre - und natürlich macht's mehr Sinn, nicht auf Verdacht eine Lösung zu entwickeln, die dann aufgrund vorher nicht bekannt(gegeben)er Vorgaben nicht einsetzbar ist.Anyhow - ein etwas weniger "morgendlicher" Ansatz zu Biber's Vorlage:
@echo off & setlocal
set "in=%temp%\input.txt"
if exist "%in%" del "%in%"
set /a FileNr=1000
for %%d in (%*) do call :ProcessFile "%%~d"
set /a NumberOfFiles=%FileNr%-1000
goto :MergeEm
:ProcessFile
set /a FileNr+=1
set /a LineNr=10000000
for /f "delims=" %%i in ('type %1') do call :outLine "%%i"
goto :eof
:outLine
set /a LineNr+=1
(echo %LineNr%-%FileNr%:%~1)>>"%in%"
goto :eof
:MergeEm
set "line="
set /a count=0
FOR /f "tokens=2 delims=:" %%f IN ('sort "%in%"') DO call :ProcessLine "%%f"
if "%line%" NEQ "" (echo %line%)
del "%in%"
goto :eof
:ProcessLine
set "line=%line% %~1"
set /a count+=1
set /a modrest=count%%%NumberOfFiles%
If %modrest%==0 (
(echo %line:~1%)
set "Line="
)
Merge.bat M1.txt M2.txt M3.txt > Ergebnis.txt
Grüße
bastla
[Edit] In Zeile for %%d in (%*) do call :ProcessFile "%%~d" ~ ergänzt [/Edit]
Hallo wickie666!
Bei mir tut's, was es soll (wenn ich gänzlich Ungetestetes poste, vermerke ich das).
Reduziere einfach einmal die erste Zeile auf "setlocal". Damit wird in der Ergebnisdatei jeder Arbeitsschritt angezeigt, bevor er ausgeführt wird (und natürlich auch dessen Ergebnis). Vielleicht nimmst Du zum Testen nur jeweils 10 Zeilen Deiner Testdateien ...
Grüße
bastla
Bei mir tut's, was es soll (wenn ich gänzlich Ungetestetes poste, vermerke ich das).
Reduziere einfach einmal die erste Zeile auf "setlocal". Damit wird in der Ergebnisdatei jeder Arbeitsschritt angezeigt, bevor er ausgeführt wird (und natürlich auch dessen Ergebnis). Vielleicht nimmst Du zum Testen nur jeweils 10 Zeilen Deiner Testdateien ...
Grüße
bastla
Hallo wickie666!
Ich nehme an, Du wirst folgendes Ergebnis spannend finden:
Also nächster Versuch - nimm ersatzweise die folgende Zeile rein:
Grüße
bastla
Ich nehme an, Du wirst folgendes Ergebnis spannend finden:
<Z:\>type merge.bat
@echo off & setlocal
set "in=%temp%\input.txt"
if exist "%in%" del "%in%"
set /a FileNr=1000
for %%d in (%*) do call :ProcessFile "%%~d"
set /a NumberOfFiles=%FileNr%-1000
goto :MergeEm
:ProcessFile
set /a FileNr+=1
set /a LineNr=10000000
for /f "delims=" %%i in ('type %1') do call :outLine "%%i"
goto :eof
:outLine
set /a LineNr+=1
(echo %LineNr%-%FileNr%:%~1)>>"%in%"
goto :eof
:MergeEm
set "line="
set /a count=0
FOR /f "tokens=2 delims=:" %%f IN ('sort "%in%"') DO call :ProcessLine "%%f"
if "%line%" NEQ "" (echo %line%)
del "%in%"
goto :eof
:ProcessLine
set "line=%line% %~1"
set /a count+=1
set /a modrest=count%%%NumberOfFiles%
If %modrest%==0 (
(echo %line:~1%)
set "Line="
)
<Z:\>type M1.txt
0
1
2
3
4
5
6
7
8
9
<Z:\>type M2.txt
TEST
asfj
asdf
asdfasfd
asdf
asfd
asdf
asdf
asdf
asfd
<Z:\>type M3.txt
Control Module
Control Module
Control Module
Control Module
Control Module
Control Module
Control Module
Control Module
Control Module
Control Module
<Z:\>merge.bat M1.txt M2.txt M3.txt
0 TEST Control Module
1 asfj Control Module
2 asdf Control Module
3 asdfasfd Control Module
4 asdf Control Module
5 asfd Control Module
6 asdf Control Module
7 asdf Control Module
8 asdf Control Module
9 asfd Control Module
<Z:\>
Also nächster Versuch - nimm ersatzweise die folgende Zeile rein:
FOR /f "tokens=2 delims=:" %%f IN ('type "%in%" ^|sort') DO call :ProcessLine "%%f"
Grüße
bastla