Gleiche Zeilen in einer Textdatei zusammenfassen
Hallo Zusammen,
Weiß leider nicht wie ich das ohne Hilfe machen soll?
Und zwar habe ich eine Texdatei die wie folgt aufgebaut ist:
AA_Beispieltext von AA1-1
BB_Beispieltext von BB1-1
CC_Beispieltext von CC1-1
DD_Beispieltext von DD1-1
DD_Beispieltext von DD1-2
DD_Beispieltext von DD1-3
EE_Beispieltext von EE1-1
FF_Beispieltext von FF1-1
AA_Beispieltext von AA2-1
BB_Beispieltext von BB2-1
CC_Beispieltext von CC2-1
DD_Beispieltext von DD2-1
DD_Beispieltext von DD2-2
EE_Beispieltext von EE2-1
FF_Beispieltext von FF2-1
Mein Problem liegt nun darin, zwischen den Zeilen AA1-1 und AA2-1 sollen die DD-Zeilen in einer einzigen DD-Zeile hintereinander geschrieben werden.
Die neue Zeile (DD_Beispieltext von DD1-1Beispieltext von DD1-2Beispieltext von DD1-3) soll nun auch noch unter die Zeile AA1-1 geschoben werden,und auch noch gefolgt von Zeile EE-1-1.
Die neue Textdatei sollte wie dann wie folgt aussehen:
AA
DD (1 bis xxx in einer Zeile)
EE
CC
FF
AA
DD
usw.
Danke für Eure Hilfe !!!!!
Weiß leider nicht wie ich das ohne Hilfe machen soll?
Und zwar habe ich eine Texdatei die wie folgt aufgebaut ist:
AA_Beispieltext von AA1-1
BB_Beispieltext von BB1-1
CC_Beispieltext von CC1-1
DD_Beispieltext von DD1-1
DD_Beispieltext von DD1-2
DD_Beispieltext von DD1-3
EE_Beispieltext von EE1-1
FF_Beispieltext von FF1-1
AA_Beispieltext von AA2-1
BB_Beispieltext von BB2-1
CC_Beispieltext von CC2-1
DD_Beispieltext von DD2-1
DD_Beispieltext von DD2-2
EE_Beispieltext von EE2-1
FF_Beispieltext von FF2-1
Mein Problem liegt nun darin, zwischen den Zeilen AA1-1 und AA2-1 sollen die DD-Zeilen in einer einzigen DD-Zeile hintereinander geschrieben werden.
Die neue Zeile (DD_Beispieltext von DD1-1Beispieltext von DD1-2Beispieltext von DD1-3) soll nun auch noch unter die Zeile AA1-1 geschoben werden,und auch noch gefolgt von Zeile EE-1-1.
Die neue Textdatei sollte wie dann wie folgt aussehen:
AA
DD (1 bis xxx in einer Zeile)
EE
CC
FF
AA
DD
usw.
Danke für Eure Hilfe !!!!!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 172680
Url: https://administrator.de/forum/gleiche-zeilen-in-einer-textdatei-zusammenfassen-172680.html
Ausgedruckt am: 23.04.2025 um 05:04 Uhr
17 Kommentare
Neuester Kommentar
Hallo -vvss-.
Das Ganze ist ziemlich abstrakt für mein Verständnis. Wie würde so etwas denn real aussehen?
Hast du es mit einer Art HTML oder XML Text zu tun?
Gibt es Zeileneinzüge (kann man bei dir nicht sehen, weil du deinen Beispielinhalt nicht in Code-Tags eingeschlossen hast)?
Gibt es feste Breiten?
Ist immer die selbe Anzahl an Leerzeichen in einer Zeile?
Gibt es Zeichen, an denen die Zeile aufgesplittet werden könnte?
...
Grüße
rubberman
Das Ganze ist ziemlich abstrakt für mein Verständnis. Wie würde so etwas denn real aussehen?
Hast du es mit einer Art HTML oder XML Text zu tun?
Gibt es Zeileneinzüge (kann man bei dir nicht sehen, weil du deinen Beispielinhalt nicht in Code-Tags eingeschlossen hast)?
Gibt es feste Breiten?
Ist immer die selbe Anzahl an Leerzeichen in einer Zeile?
Gibt es Zeichen, an denen die Zeile aufgesplittet werden könnte?
...
Grüße
rubberman
Hallo -vvss-,
teste mal folgendes:
Ansonsten kann ich rubberman nur beipflichten, sehr abstrakt.
[EDIT]
Script geändert:
Schönheitsfehler:
Gruß
Friemler
teste mal folgendes:
@echo off & setlocal
::Diese beiden Variablen anpassen
set "InFile=.\test.txt"
set "OutFile=.\test2.txt"
::Interne Variablen initialisieren
set "BufferFile=%Temp%\Buffer.txt"
set "DDLineBuffer=%Temp%\DDBuffer.txt"
::Evtl. existierende Dateien löschen
del "%OutFile%" 2>NUL
del "%BufferFile%" 2>NUL
del "%DDLineBuffer%" 2>NUL
::Aus der Eingabedatei alle Zeilen einlesen
for /f "tokens=1* delims=_" %%a in ('findstr "^" "%InFile%"') do (
set "Prefix=%%a"
rem Unterprogramm ProcessLine aufrufen
rem und dessen Ausgaben in die Ausgabedatei schreiben
>>"%OutFile%" call :ProcessLine
)
::Evtl. existierende Bufferdatei für DD-Zeile an die Ausgabedatei anhängen
::Notwendig falls die letzte Zeile in der Eingabedatei mit DD beginnt
if exist "%DDLineBuffer%" >>"%OutFile%" (type "%DDLineBuffer%" & echo.)
::Evtl. existierende Bufferdatei an die Ausgabedatei anhängen
::Notwendig um den letzten Block der Eingabedatei vollständig zu schreiben
if exist "%BufferFile%" >>"%OutFile%" type "%BufferFile%"
::Bufferdateien löschen
del "%BufferFile%" 2>NUL
del "%DDLineBuffer%" 2>NUL
::Scriptende
exit /b
::Unterprogramm
:ProcessLine
::Ist es eine Zeile, die mit AA beginnt?
if "%Prefix%" equ "AA" (
rem Existiert die Bufferdatei schon?
if exist "%BufferFile%" (
rem Ja: Bufferdatei ausgeben und danach löschen
type "%BufferFile%"
del "%BufferFile%"
)
rem Die aktuelle Zeile ausgeben,
rem und Rücksprung ins Hauptprogramm
for /l %%x in (1,1,1) do echo %%a_%%b
exit /b
)
::Ist es eine Zeile, die mit DD beginnt?
if "%Prefix%" equ "DD" (
rem Wurde gerade die erste dieser Zeilen eingelesen?
if not exist "%DDLineBuffer%" (
rem Ja: Zeileninhalt MIT Prefix und "_" in Bufferdatei für DD-Zeile schreiben (ohne Zeilenumbruch)
for /l %%x in (1,1,1) do > "%DDLineBuffer%" <NUL set /p "=%%a_%%b "
) else (
rem Nein: Zeileninhalt OHNE Prefix und "_" an Bufferdatei für DD-Zeile anhängen (ohne Zeilenumbruch)
for /l %%x in (1,1,1) do >>"%DDLineBuffer%" <NUL set /p "=%%b "
)
rem Rücksprung ins Hauptprogramm
exit /b
)
::Wenn die Zeile, die mit EE beginnt, eingelesen wurde,
::den Inhalt der Bufferdatei für die DD-Zeile plus Zeilenumbruch ausgeben,
::Bufferdatei für die DD-Zeile löschen,
::die aktuelle Zeile ausgeben,
::Rücksprung ins Hauptprogramm.
if "%Prefix%" equ "EE" (
type "%DDLineBuffer%" & echo.
del "%DDLineBuffer%"
for /l %%x in (1,1,1) do echo %%a_%%b
exit /b
)
::Zeilen, die durch die obigen Blöcke nicht verarbeitet wurden,
::in eine Bufferdatei schreiben
for /l %%x in (1,1,1) do (
rem Enthält die Zeile nach dem Prefix noch weitere Zeichen?
if "%%c" neq "" (
rem Ja: Alles ausgeben
>>"%BufferFile%" echo %%a_%%b
) else (
rem Nein: Nur das Prefix oder, wenn die Zeile auch kein
rem Prefix enthält, eine Leerzeile ausgeben
>>"%BufferFile%" echo\%%a
)
)
::Rücksprung ins Hauptprogramm
exit /b
Ansonsten kann ich rubberman nur beipflichten, sehr abstrakt.
[EDIT]
Script geändert:
- Die Zerlegung der Eingabedatei wird anhand der ersten x Zeichen jeder Zeile (die Prefixes, hier AA, BB, usw., nach denen ein
_
kommen muss) durchgeführt. - Sonderzeichen in den Texten sind kein Problem, in den Prefixes schon.
- Leere Zeilen werden übernommen.
Schönheitsfehler:
- Die Zeile, in der die mehrfachen DD-Zeilen zusammengefasst sind, enthält als letztes Zeichen ein Leerzeichen.
Gruß
Friemler
moin vvss,
falls Frimlers Script nicht tat gib mal Antwort (bzw. überhaupt mal ein Lebenszeichen).
hier ist nochwas Falls nur am Ende die Ziffern mit Strich sind.
Die Datei Draufziehen
Gruß Phil
falls Frimlers Script nicht tat gib mal Antwort (bzw. überhaupt mal ein Lebenszeichen).
hier ist nochwas Falls nur am Ende die Ziffern mit Strich sind.
Die Datei Draufziehen
@echo off&setlocal
:: Bitte zuerst mit Testdaten Probieren
if not exist "%~1" goto :eof
findstr /r /c:"^DD_.*1-[0-9]*$" "%~1">"%~dpn1.test"
for /f "usebackq delims=" %%i in ("%~dpn1.test") do (set "Line=%%i"
setlocal enabledelayedexpansion
for /f "delims=" %%j in ("!NewLine!!Line!") do endlocal & set "NewLine=%%j"
)
findstr /v /r /c:"^DD_.*1-[0-9]*$" "%~1">"%~dpn1.test"
findstr /r /c:"^AA_.*1-[0-9]*$" "%~dpn1.test" > "%~1"
setlocal enabledelayedexpansion
>>"%~1" echo !NewLine!
endlocal
findstr /r /c:"^EE_.*1-[0-9]*$" "%~dpn1.test" >> "%~1"
findstr /v /r /c:"^[ADE][ADE]_.*1-[0-9]*$" "%~dpn1.test" >> "%~1"
del "%~dpn1.test"
Gruß Phil
Was ist mit BB und CC passiert? Sollen die nicht mit rein?
DD (1 bis xxx in einer Zeile)
EE
CC
EE
CC
Oder doch? Nur ein bischen?
FF
AA
DD
usw.
Danke für Eure Hilfe !!!!!
AA
DD
usw.
Danke für Eure Hilfe !!!!!
Irgendwie hast Du das Problem imho nicht genau genug beschrieben.
Ich hätte aufgrund Deiner Beschreibung einfach folgendes gemacht (in bash):
cat textdatei.txt | gawk -F "_" { print $1 } ' | uniq >ergebnisdatei.txt
Hallo -vvss-,
ich habe mein Script an Deine (nun präzisierten) Anforderungen angepasst.
Btr. Einsteigerkurs: Schau Dir mal mein Tutorial zur FOR-Schleife inkl. der Kommentare von Jeb-the-Batcher und pieh-ejdsch an.
Gruß
Friemler
ich habe mein Script an Deine (nun präzisierten) Anforderungen angepasst.
Btr. Einsteigerkurs: Schau Dir mal mein Tutorial zur FOR-Schleife inkl. der Kommentare von Jeb-the-Batcher und pieh-ejdsch an.
Gruß
Friemler
moin vvss,
geht das komplett? auch die datei Draufziehen.
[Edit]
Fehler Bereinigt
[/Edit]
Gruß Phil
geht das komplett? auch die datei Draufziehen.
@echo off&setlocal
:: Bitte zuerst mit Testdaten Probieren
if not exist "%~1" goto :eof
set "Begin=0"
set "End=0"
type nul >"%~dpn1-Neu%~x1"
for /f tokens^=1^,*^ delims^=:^ %%i in ('" findstr /r /n /c:"^AA_" "%~1" & find /v /c "" < "%~1"" ') do (
setlocal enabledelayedexpansion
set /a "End = %%i - 1"
if !Begin! equ %%i set /a "End = %%i"
for /f "tokens=1,2" %%j in ("!Begin! !End!") do (endlocal
set /a "Begin = %%i"
set /a "End = %%k"
if %%k neq 0 for /l %%l in (%%j,1,%%k) do (
for /f "tokens=1,2* delims=:_" %%m in ('findstr /n "^" "%~1" ^| findstr /b "%%l:" ') do (set "Line=%%o"
setlocal enabledelayedexpansion
(
for /f "delims=" %%p in ("!NewLine_%%n!!Line!") do endlocal & set "NewLine_%%n=%%p"
)||endlocal
) ) )
for %%l in ("Newline_AA" "Newline_DD" "Newline_EE") do for /f "tokens=1* delims=_" %%m in ("%%~l") do (cmd /von /c if defined %%~l echo %%~n_!%%~l!
) & set "%%~l="
for /f "tokens=1,2* delims=_=" %%l in ('set Newline_ 2^>nul') do set "%%l_%%m=" & echo %%m_%%n
)>>"%~dpn1-Neu%~x1"
[Edit]
Fehler Bereinigt
[/Edit]
Gruß Phil
moin vvss,
hier ist eines mit Ausfühlicher Erklärung
warum das Ding allerdings PaarPfade / Dateien nicht findet ist mir nicht klar es Tut jedenfalls
Gruß Phil
hier ist eines mit Ausfühlicher Erklärung
warum das Ding allerdings PaarPfade / Dateien nicht findet ist mir nicht klar es Tut jedenfalls
:: Der Befehl wird nicht angezeigt; Echo Ausgabe wird dektiviert und eine Lokalisierung von Variablen Beginnt
@echo off&setlocal
:: Bitte zuerst mit Testdaten Probieren
:: wenn der Erste (nicht unbedingt der Zweite) Parameter NICHT im Dateisystem Existiert wird der Batch nicht abgebrochen sondern Beendet
if not exist "%~1" goto :eof
:: Die Variablen Begin; End fürs Zeilenseparien werden gesetzt
set "Begin=0"
set "End=0"
:: Die Datei wird als Kopie mit dem zusatz "-Neu" im Dateinamen erstellt
type nul >"%~dpn1-Neu%~x1"
:: Die Forschleife gibt die Zeilennummern der Datei worin AA_ am Anfang gefunden wird nacheinander aus; zum Schluss die GesamtZeilenanzahl der Datei
for /f delims^=: %%i in ('findstr /r /n /c:"^AA_" "%~1" ^& find /v /c "" ^< "%~1"') do (
:: Die Verzögerte Variablenauflösung wird Aktiviert und eine neue Lokalisierung der Variablen beginnt
setlocal enabledelayedexpansion
:: Die ausgegebene ZeilenNummer wird minus 1 in die Variable End gesetzt
set /a "End = %%i - 1"
:: Wenn die Variable Beginn gleich der ZeilenNummer ist wird die die ZeilenNummer in die Variable End gesetzt
if !Begin! equ %%i set /a "End = %%i"
:: Diese Forschleife gibt die zur LaufZeit gültigen Variablen Begin; End in das 1. und 2. Token aus.
:: Die Verzögerung wird mittels beenden der Lokalisierung abgeschalten.
for /f "tokens=1,2" %%j in ("!Begin! !End!") do (endlocal
:: Die Variablen werden für spätere / weitere Nutzung gesetzt
set /a "Begin = %%i"
set /a "End = %%k"
:: Wenn das 2. Token (ende des Absatzes) größer als 0 ist wird die Forschleife ausgeführt
:: Die Anfangzeilennummer; die dazwischen und die EndZeilennummer werden nacheinander ausgegeben
if %%k neq 0 for /l %%l in (%%j,1,%%k) do (
:: die Zeilennummer des Absatzes wird gesucht; die Zeile wird im 2. ( %%n ) und 3. ( %%o ) Token ausgegeben
:: der Teil nach _ wird in die Variable Line gesetzt
for /f "tokens=1,2* delims=:_" %%m in (' findstr /n "^" "%~1" 2^>nul ^| findstr /b "%%l:" 2^>nul ') do (set "Line=%%o"
:: das hatten wir schon ...
setlocal enabledelayedexpansion
:: hier die Ohne 1. 36 Zeichen im Anfang DD_ (minus 3)
if "%%n" == "DD" set "Line=!Line:~33!"
:: wenn das 2. ( %%n ) Token CC ist wird ; sonst das mit OHNE
:: die Variable Newline_<1.Token> und der Rest der Zeile i AnführungsZeichen wird zu späteren Verwendung in die Variable Newline_<1.Token> gesetzt
if "%%n" == "CC" for /f "delims=" %%p in ("!NewLine_%%n!" "!Line!") do endlocal & set "NewLine_%%n=%%p"
:: hier mit OHNE AnführungsZeichen
if not "%%n" == "CC" for /f "delims=" %%p in ("!NewLine_%%n!!Line!") do endlocal & set "NewLine_%%n=%%p"
:: Ja wenn die Verzögerte Dings noch an is dann Ausmachen
if "!os!" == "%os%" endloacal
) ) )
:: Hier werden die Variablen in der gewünschten Reihenfolge ins Handle 3 ausgegeben und gelöscht
for %%l in ("Newline_AA" "Newline_DD" "Newline_EE") do for /f "tokens=1* delims=_" %%m in ("%%~l") do (cmd /von /c if defined %%~l >&3 echo %%~n_!%%~l!
) & set "%%~l="
:: Hier werden die restlichen Variablen beginnend mit Newline_ Alphabetisch ins Handle 3 ausgegeben und gelöscht
for /f "tokens=1,2* delims=_=" %%l in ('set Newline_ 2^>nul') do for %%o in ("%%n") do for /f %%p in ("%%~o") do set "%%l_%%m=" & >&3 echo %%m_%%~o
:: hier wird rem benutzt damit ein letzter Befehl und Keine LeerZeile oder Kommentarzeile mit :: die SchleifenKlammer zunichte macht
:: keine Ahnung warum der eine Datei oder nen Pfad nicht findet aber die FehlerAusgabe kommt in die Tonne
rem schreibe alle Eingaben von Handle 3 nacheinander in die Datei
) 3>>"%~dpn1-Neu%~x1" 2>nul
Gruß Phil

:: Bitte zuerst mit Testdaten Probieren
:: wenn der Zweite Parameter NICHT im Dateisystem Existiert wird der Batch abgebrochen
if not exist "%~1" goto :eof
Und warum wird dann der 1. und nicht der 2. Parameter überprüft?
Moin -vvss-,
wahrscheinlich stimmen Wunsch in Zeile 76 und Wirklichkeit in Zeile 77 und 81 nicht überein.
Setze doch mal das kryptische Gestrunkele "if defined %%~l >&3 " ein wenig kryptischer zu machen.
Maskiere die Sonderzeichen ">" und "&" und "3" jeweisl mit einem Caret (^)
Ziel: "if defined %%~l ^>^&^3 "
Obwohl.... wenn Batchskripte so kompliziert aussähen müssten, dann wären bis heute so drei bis fünf zum Laufen gekommen.
Wer soll den ### denn warten und pflegen?
Grüße
Biber
wahrscheinlich stimmen Wunsch in Zeile 76 und Wirklichkeit in Zeile 77 und 81 nicht überein.
Setze doch mal das kryptische Gestrunkele "if defined %%~l >&3 " ein wenig kryptischer zu machen.
Maskiere die Sonderzeichen ">" und "&" und "3" jeweisl mit einem Caret (^)
Ziel: "if defined %%~l ^>^&^3 "
Obwohl.... wenn Batchskripte so kompliziert aussähen müssten, dann wären bis heute so drei bis fünf zum Laufen gekommen.
Wer soll den ### denn warten und pflegen?
Grüße
Biber
moin -vvss-,
die extraUmleitung des Handle 3 sollte normal schon so in Ordnung sein.
&>3
Das habe ich aber nur gemacht, damit ich die Batch mit Angeschaltenem Echo Testen konnte und nur die gewünschte Ausgabe in der Datei hatte.
Wenn die Batch mit "echo off" läuft, braucht natürlich nicht erst in Handle 3 und dann von da in die Datei umgeleitet werden.
schau dir mal die Ausgabe bis zur Pause an - was wird da speziell ausgegeben? Einzelne Zeilen der Datei oder garnichts.
was steht in der "file.log" drin?
PS: den Komplett Durchkommentierten Batch brauchst Du nicht zu posten; es sollte ja nur für Dich als Erklärung der vielen Prozentzeichen dienen.
Gruß Phil
die extraUmleitung des Handle 3 sollte normal schon so in Ordnung sein.
&>3
Das habe ich aber nur gemacht, damit ich die Batch mit Angeschaltenem Echo Testen konnte und nur die gewünschte Ausgabe in der Datei hatte.
Wenn die Batch mit "echo off" läuft, braucht natürlich nicht erst in Handle 3 und dann von da in die Datei umgeleitet werden.
schau dir mal die Ausgabe bis zur Pause an - was wird da speziell ausgegeben? Einzelne Zeilen der Datei oder garnichts.
was steht in der "file.log" drin?
PS: den Komplett Durchkommentierten Batch brauchst Du nicht zu posten; es sollte ja nur für Dich als Erklärung der vielen Prozentzeichen dienen.
Gruß Phil