Inhalt einer mehrere Zeilen umfassenden txt-Datei als Variable
Hallo Leute,
Ich hab eine txt-Datei, die aus ein paar Zeilen besteht, in jeder Zeile stehen ein oder mehrere durch Leerzeichen getrennte Worte. In manchen Zeilen steht dasselbe. Beispieldatei:
das ist
ein Beispiel für
eine oben
geschilderte
Textdatei.
geschilderte
Textdatei.
- Wie kann ich die doppelten Zeilen von der Verarbeitung ausschließen?
- Wie kann ich den restlichen Inhalt dieser Datei als EINE Variable darstellen?
- Wie kann ich dabei die Zeilenumbrüche entfernen und durch Komma-Leerzeichen (, ) ersetzen?
Ich steh mal wieder tierisch auf dem Schlauch und bin dankbar für jede Hilfe!
Gruß
Martin
Ich hab eine txt-Datei, die aus ein paar Zeilen besteht, in jeder Zeile stehen ein oder mehrere durch Leerzeichen getrennte Worte. In manchen Zeilen steht dasselbe. Beispieldatei:
das ist
ein Beispiel für
eine oben
geschilderte
Textdatei.
geschilderte
Textdatei.
- Wie kann ich die doppelten Zeilen von der Verarbeitung ausschließen?
- Wie kann ich den restlichen Inhalt dieser Datei als EINE Variable darstellen?
- Wie kann ich dabei die Zeilenumbrüche entfernen und durch Komma-Leerzeichen (, ) ersetzen?
Ich steh mal wieder tierisch auf dem Schlauch und bin dankbar für jede Hilfe!
Gruß
Martin
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 176705
Url: https://administrator.de/contentid/176705
Ausgedruckt am: 24.11.2024 um 04:11 Uhr
12 Kommentare
Neuester Kommentar
Hallo martinstein!
Wenn Du tatsächlich aus dem gesamten Inhalt eine einzige Zeile (ohne Wiederholungen) machen möchtest, dann im einfachsten Fall etwa so:
Es wird zunächst die Variable mit der Trennzeichensequenz Komma + Leerzeichen vorbelegt - so kann dann nachher für jede Zeile verglichen werden, ob sie in der Variablen bereits enthalten ist, ohne dass irrtümlich ein Teilstring ausgeschlossen würde - wenn etwa in Deiner Beispieldatei als letzte Zeile noch
folgen würde, müsste eigentlich diese Zeile ebenfalls in das Ergebnis aufgenommen werden (vorher hieße es ja "eine oben"). Um dies zu erreichen, wird jeweils der Zeileninhalt mit Trennzeichen davor und danach verglichen - im Beispiel würde also nicht untersucht, ob sich "oben" schon in der Variablen befindet, sondern es wird (in Zeile 11) auf
geprüft. Je nach dem Ergebnis dieser Prüfung wird dann bei "Zeile ist bereits enthalten" sofort zurückge- und damit die Zeile übersprungen, oder an die Variable die Zeile + Trennzeichen angefügt.
Am Ende enthält die Variable daher jeweils am Anfang und am Ende die beiden Trennzeichen, weshalb sie per Teilstringbildung (Zeile 6 bedeutet: Verwende alles nach den ersten beiden Zeichen bis vor die letzten beiden Zeichen!) korrigiert werden muss.
Grüße
bastla
Wenn Du tatsächlich aus dem gesamten Inhalt eine einzige Zeile (ohne Wiederholungen) machen möchtest, dann im einfachsten Fall etwa so:
@echo off & setlocal
set "Ein=D:\Textdatei.txt"
set "Var=, "
for /f "usebackq delims=" %%i in ("%Ein%") do call :ProcessLine "%%i"
set "Var=%Var:~2,-2%"
set Var
goto :eof
:ProcessLine
echo "%Var%"|findstr /c:", %~1, ">nul && goto :eof
set "Var=%Var%%~1, "
goto :eof
oben
, oben,
Am Ende enthält die Variable daher jeweils am Anfang und am Ende die beiden Trennzeichen, weshalb sie per Teilstringbildung (Zeile 6 bedeutet: Verwende alles nach den ersten beiden Zeichen bis vor die letzten beiden Zeichen!) korrigiert werden muss.
Grüße
bastla
Hallo martinstein und hallo bastla!
Genauso, nur anders:
Der Code unterscheidet sich nicht wesentlich. Auch bastlas Version könnte ohne Subroutine auskommen, solang keine Ausrufezeichen in der Datei vorkommen. Unterschied ist, dass bei der SET /P Variante in meinem Code, trotz verzögerter Variablenerweiterung, Ausrufezeichen im Text nicht eliminiert werden.
Eine Anmerkung sollte aber noch kommen:
Strings dürfen nicht endlos lang sein!
Grüße
rubberman
Genauso, nur anders:
@echo off &setlocal
set "Ein=D:\Textdatei.txt"
setlocal enabledelayedexpansion &set "Var=, "
<"%Ein%" (for /f %%i in ('type "%Ein%"^|find /c /v ""') do for /l %%j in (1 1 %%i) do (
set /p "ln=" &echo "!Var!"|findstr /c:", !ln!, ">nul ||set "Var=!Var!!ln!, ")
)
endlocal &set "Var=%Var:~2,-2%"
set Var
pause
Der Code unterscheidet sich nicht wesentlich. Auch bastlas Version könnte ohne Subroutine auskommen, solang keine Ausrufezeichen in der Datei vorkommen. Unterschied ist, dass bei der SET /P Variante in meinem Code, trotz verzögerter Variablenerweiterung, Ausrufezeichen im Text nicht eliminiert werden.
Eine Anmerkung sollte aber noch kommen:
Strings dürfen nicht endlos lang sein!
Grüße
rubberman
Moin martinstein,
die Längenbeschränkung ist nicht nicht 204, sondern mindestens 2047 (also 2048-1 bzw 2 hoch 12 minus ein Nullbyte)
Im Falle Windows-wie-immer-die-heutige-Zwischenversion-heisst auch durchaus das 4fache.
Wenn du damit auch nur in die Nähe eines möglichen Datenverlusts kommst--> dann nimm ein anderes Werkzeug.
Es gibt keinen "verschmerzbaren Datenverlust", jedenfalls nicht in diesem Seitenarm des Forums.
Ein paar andere Werkzeuge können wir auch zur Not bedienen.
Grüße
Biber
[Edit] ...doppelt zu spät ... [/Edit]
die Längenbeschränkung ist nicht nicht 204, sondern mindestens 2047 (also 2048-1 bzw 2 hoch 12 minus ein Nullbyte)
Im Falle Windows-wie-immer-die-heutige-Zwischenversion-heisst auch durchaus das 4fache.
Wenn du damit auch nur in die Nähe eines möglichen Datenverlusts kommst--> dann nimm ein anderes Werkzeug.
Es gibt keinen "verschmerzbaren Datenverlust", jedenfalls nicht in diesem Seitenarm des Forums.
Ein paar andere Werkzeuge können wir auch zur Not bedienen.
Grüße
Biber
[Edit] ...doppelt zu spät ... [/Edit]