Aus Fragmenten einer Textdatei eine neue Textdatei erzeugen bzw. das original bearbeiten
Hallo Forumsmitglieder, ich hoffe Ihr seid alle gut ins Neue Jahr gekommen und seid ausgeruht und motiviert mir weiter zu helfen ;)
Ausgangssituation ist eine Liste von *.nfo Dateien die alle eine Zeile mit folgedem String enthalten
<ID>ttXXXXXXX</ID> (X steht für eine beliebige Zahl)
Ziel ist jeweils die entsprechende .nfo Datei so zu verändern das nur noch folgender String darin steht:
http://www.imdb.com/title/ttXXXXXXX
Falls das nicht möglich ist wäre auch eine neue Datei etwa nach dem Schema *.nfo_new denkbar.
Ich habe mit Hilfe der Beiträge in diesem Forum mal begonnen, komme aber nicht so recht ans Ziel. Ich hoffe Ihr Jungs/Mädels hier könnt mir weiterhelfen ?
Es wäre cool wenn Ihr die Lösung nicht in einer einzigen Zeile präsentieren würdet, damit mir das Nachvollziehen leichter fällt ;)
Anbei mein jetziger Code:
Danke & Gruß
T3Knopap$T
Ausgangssituation ist eine Liste von *.nfo Dateien die alle eine Zeile mit folgedem String enthalten
<ID>ttXXXXXXX</ID> (X steht für eine beliebige Zahl)
Ziel ist jeweils die entsprechende .nfo Datei so zu verändern das nur noch folgender String darin steht:
http://www.imdb.com/title/ttXXXXXXX
Falls das nicht möglich ist wäre auch eine neue Datei etwa nach dem Schema *.nfo_new denkbar.
Ich habe mit Hilfe der Beiträge in diesem Forum mal begonnen, komme aber nicht so recht ans Ziel. Ich hoffe Ihr Jungs/Mädels hier könnt mir weiterhelfen ?
Es wäre cool wenn Ihr die Lösung nicht in einer einzigen Zeile präsentieren würdet, damit mir das Nachvollziehen leichter fällt ;)
Anbei mein jetziger Code:
@ECHO OFF
set "ListName=list.txt"
set "ResultList=result.txt"
IF EXIST %ListName% DEL %ListName%
IF EXIST %ResultList% DEL %ResultList%
REM Liste der Dateinamen erzeugen
CMD /C dir *.nfo /B /s /a-D >>.\%ListName%
REM In jeder Datei der Liste READ_NFO aufrufen
FOR /f %%f IN (%ListName%) DO call :READ_NFO "%%f"
GOTO eof
REM nach dem String tt..... in der übergebenen Datei suchen
:READ_NFO
set "Dateiname=%~1"
set "URL_BASE=http://www.imdb.com/title/"
findstr /I "<id>........." %Dateiname%>>%ResultList%
if %errorlevel%==0 (
echo .
) else (
echo No Match in %Dateiname%
)
GOTO eof
:eof
Danke & Gruß
T3Knopap$T
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 158766
Url: https://administrator.de/forum/aus-fragmenten-einer-textdatei-eine-neue-textdatei-erzeugen-bzw-das-original-bearbeiten-158766.html
Ausgedruckt am: 12.01.2025 um 11:01 Uhr
6 Kommentare
Neuester Kommentar
Hallo T3Knopap$T und willkommen im Forum.
Hmm, meiner Meinung nach ist das aber in einer Zeile abgehandelt.
Wenn das so funktioniert, kannst du statt >"%%~a_new" auch >"%%~a" verwenden, um die ursprüngliche Datei zu überschreiben.
Zur Erklärung:
Wenn du dir mal ansiehst, was ein findstr /i "<id>........." *.nfo ausgibt, wirst du feststellen, dass das Format wie folgt ist:
Dateiname:Zeileninhalt
In der ersten FOR Schleife wird der Doppelpunkt als Delimiter benutzt. Somit ist der Dateiname in %%a und die Zeile in %%b.
In der zweiten FOR Schleife wird %%b an den Zeichen < und > zerhackstückelt. Interessant ist dann nur das zweite Token (Zeichenfolge zwischen <id> und </id>), das sich in %%c wiederfindet.
Grüße
rubberman
Zitat von @TEKnopapST:
Es wäre cool wenn Ihr die Lösung nicht in einer einzigen Zeile präsentieren würdet, damit mir das
Nachvollziehen leichter fällt ;)
Es wäre cool wenn Ihr die Lösung nicht in einer einzigen Zeile präsentieren würdet, damit mir das
Nachvollziehen leichter fällt ;)
Hmm, meiner Meinung nach ist das aber in einer Zeile abgehandelt.
for /f "tokens=1* delims=:" %%a in ('findstr /i "<id>........." *.nfo') do for /f "tokens=2 delims=<>" %%c in ("%%b") do >"%%~a_new" echo http://www.imdb.com/title/%%c
Zur Erklärung:
Wenn du dir mal ansiehst, was ein findstr /i "<id>........." *.nfo ausgibt, wirst du feststellen, dass das Format wie folgt ist:
Dateiname:Zeileninhalt
In der ersten FOR Schleife wird der Doppelpunkt als Delimiter benutzt. Somit ist der Dateiname in %%a und die Zeile in %%b.
In der zweiten FOR Schleife wird %%b an den Zeichen < und > zerhackstückelt. Interessant ist dann nur das zweite Token (Zeichenfolge zwischen <id> und </id>), das sich in %%c wiederfindet.
Grüße
rubberman
Hallo T3Knopap$T
Kaskadieren wir den vermeintlichen Einzeiler mal, um es etwas übersichtlicher zu machen:
~~~snippp~~~
~~~snippp~~~
Grüße
rubberman
Zitat von @TEKnopapST:
Musste "tokens" in der 2 FOR-Schleife auf 3 setzen sonst kam immer ID als Ergebnis heraus.
Deinem ersten Posting zufolge kamen keine (Leer-)Zeichen vor <id>. Muss einem schon gesagt werden Musste "tokens" in der 2 FOR-Schleife auf 3 setzen sonst kam immer ID als Ergebnis heraus.
Zitat von @TEKnopapST:
Weiterhin wäre es schön wenn das ganze nur gemacht wird wenn auch wirklich <ID> in der *.nfo gefunden wurde, da
bei einem zweiten Durchlauf ja schon einige der Dateien umgestellt worden sind und ich dann nur noch die neu hinzugekommenen
ändern muss ;)
Naja, du prüfst ja bereits mit FINDSTR, ob <id> vorkommt. Andererseits schreibst du ja im Moment *.nfo_new - Dateien. Somit kannst du vorher prüfen, ob zu einer *.nfo - Datei das entsprechende Gegstück schon vorhanden ist.Weiterhin wäre es schön wenn das ganze nur gemacht wird wenn auch wirklich <ID> in der *.nfo gefunden wurde, da
bei einem zweiten Durchlauf ja schon einige der Dateien umgestellt worden sind und ich dann nur noch die neu hinzugekommenen
ändern muss ;)
Kaskadieren wir den vermeintlichen Einzeiler mal, um es etwas übersichtlicher zu machen:
~~~snippp~~~
for /f "delims=" %%a in ('dir /a-d /b /s *.nfo') do (
if not exist "%%~a_new" (
for /f "tokens=3 delims=<>" %%b in ('findstr /i "<id>........." "%%~a"') do (
>"%%~a_new" echo http://www.imdb.com/title/%%b
)
)
)
Grüße
rubberman
Hallo T3Knopap$T,
Das mit delims und tokens ist relativ einfach.
Angenommen du definierst "tokens=2,3 delims=#$"
und lässt das über einen String laufen, der so aussieht:
#qwe#asd$#yxc$$$$$rtz
Die Tilde (~) dient für mich zur inneren Beruhigung
Sie entfernt (auch wenn es nicht nötig ist) umschließende Anführungszeichen im Wert der Laufvariablen. Wie du siehst setze ich das ganze anschließend wieder in Anführungszeichen um nicht in einen Fehler zu laufen, falls du zB. Leerzeichen im Pfad oder Dateinamen hast. Die Tilde stellt also letztlich nur sicher, dass das ganze nicht zweifach in Anführungszeichen steht.
Grüße
rubberman
Das mit delims und tokens ist relativ einfach.
Angenommen du definierst "tokens=2,3 delims=#$"
und lässt das über einen String laufen, der so aussieht:
#qwe#asd$#yxc$$$$$rtz
- delims=#$ - Der String wird an # oder $ getrennt, wobei Trennzeichen die ganz am Anfang des Strings stehen einfach nur eliminiert werden, was den Stellenwert des nachfolgenden Teilstrings aber nicht beeinflusst (es ist immernoch das erste Teilstück). Mehrfache Trennzeichen werden wie ein einziges behandelt.
- tokens=2,3 - Das zweite Teilstück des Strings (asd) wandert in die angegebene Laufvariable, das dritte Teilstück (yxc) in die nächst höhere Laufvariable. Das ist schon grundsätzlich alles.
Die Tilde (~) dient für mich zur inneren Beruhigung
Sie entfernt (auch wenn es nicht nötig ist) umschließende Anführungszeichen im Wert der Laufvariablen. Wie du siehst setze ich das ganze anschließend wieder in Anführungszeichen um nicht in einen Fehler zu laufen, falls du zB. Leerzeichen im Pfad oder Dateinamen hast. Die Tilde stellt also letztlich nur sicher, dass das ganze nicht zweifach in Anführungszeichen steht.
Grüße
rubberman