avatarius
Goto Top

Zeichen in verschiedenen txt bzw. lrc dateien ersetzen

Hallo,

ich habe folgendes Problem.

Ausgangssituation:
- Lyricdateien : "verschiedene Dateiennamen".txt und .lrc
- Befinden sich im selben Ordner
- Dateiinhalt z.B:
[ti:titel]
[ar:artist]
[al:album]
[by:bla]
[00:20.05]Text1.
[00:22.59]Text2.
...
[nn:nn.nn]Textn.

der inhalt [xx:xx.xx] kann schon ab der 3./5.ten beginnen, ist also nicht fest ab zeile 4

Nun will ich die jeweils [xx:xx.xx] in [xx:xx:xx] ändern. Also nur den Punkt in den eckigen Klammern, nicht den am Ende der Zeile.

Kann man mittels einer batch datei diese ersetzungen vornehmen und anschließend die quelldatei mit ersetzungen speichern?


Habe mir verschiedene Posts zum manipulieren von dateiinhalten durchgelesen, konnte aber leider keinen auf mein Problem anwenden.


Vielen Dank.

Norbert

Content-Key: 82370

Url: https://administrator.de/contentid/82370

Printed on: April 24, 2024 at 01:04 o'clock

Member: miniversum
miniversum Mar 05, 2008 at 12:15:02 (UTC)
Goto Top
Ich schreib mal was ungetestetes für eine Datei.
Wenn das bei dir so funktioniert kann man das dan auf mehrere Dateien umbauen.
@echo off & setlocal enabledelayedexpansion
set "Filename=C:\Dateiname.txt"  
if exist "%filename%.tmp" del "%filename%.tmp"  
FOR /F "tokens=1* delims=]" %%a in ('type "%Filename%"') do  (  
set p1=%%a]
set p2=%%b
if "!p1:~0,4!" equ "[ti:" echo !p1!!p2!>>"%filename%.tmp"  
if "!p1:~0,4!" equ "[ar:" echo !p1!!p2!>>"%filename%.tmp"  
if "!p1:~0,4!" equ "[al:" echo !p1!!p2!>>"%filename%.tmp"  
if "!p1:~0,4!" equ "[by:" echo !p1!!p2!>>"%filename%.tmp"  
echo !p1:.=:!!p2!>>"%filename%.tmp"  
)
move /y "%filename%.tmp" "%filename%"  

miniversum
Member: Avatarius
Avatarius Mar 05, 2008 at 14:43:02 (UTC)
Goto Top
Hallo miniversum,

Vielen Dank für die schnelle Antwort, dein code hat mein Problem schon fast gelöst.
Einziges Problem:
die Zeilen bei denen die if-Überprüfung wahr ergibt stehen doppelt in der Datei.

Ansonsten hat alles funktioniert.

Als Lösung habe ich dein code wie folgt modifiziert.
Weiß zwar nicht genau warum aber es klappt.

@echo off & setlocal enabledelayedexpansion
set "Filename=C:\""test 2".lrc""  
if exist "%filename%.tmp" del "%filename%.tmp"  
FOR /F "tokens=1* delims=]" %%a in ('type "%Filename%"') do  (  
set p1=%%a]
set p2=%%b
if "!p1:~0,4!" equ "[enc" echo off  
if "!p1:~0,4!" equ "[ti:" echo off  
if "!p1:~0,4!" equ "[ar:" echo off  
if "!p1:~0,4!" equ "[al:" echo off  
if "!p1:~0,4!" equ "[by:" echo off  
if "!p1:~0,4!" equ "[off" echo off  
echo !p1:.=:!!p2!>>"%filename%.tmp"  
)
move /y "%filename%.tmp" "%filename%"  

Die beiden zusätzlichen Einträge fangen weitere mögliche Einträge ab.

Die Rückgabe sieht nun so aus:

[ti:titel]
[ar:artist]
[al:album]
[by:bla]
[00:20:05]Text1.
[00:22:59]Text2.
...
[nn:nn:nn]Textn.

ist genau das was ich wollte.


bleibt noch folgendes *g*:

Wie erreicht man, das Leerzeilen erhalten bleiben?
Hab folgendes probiert:
if "!p1!" equ "" echo. >>"%filename%.tmp"  
if "!p1!" == "" echo. >>"%filename%.tmp"  
if "!p1!" ==  echo. >>"%filename%.tmp"  
klappt aber nicht.

Wie kann man erreichen, das er das für alle dateien in dem Ordner macht?


danke schön
norbert
Member: miniversum
miniversum Mar 05, 2008 at 18:19:54 (UTC)
Goto Top
oh ja sehe ich auch grade. Leerzeilen und das doppelte sollte so besser gehen:
@echo off & setlocal enabledelayedexpansion
set "Filename=C:\Dateiname.txt"  
if exist "%filename%.tmp" del "%filename%.tmp"  
FOR /F "tokens=1,2* delims=:]" %%a in ('findstr .* "%Filename%"') do  (  
set p1=%%b]
set p2=%%c
if "!p1:~0,4!" equ "[ti:" (echo.!p1!!p2!>>"%filename%.tmp" & goto:washeader)  
if "!p1:~0,4!" equ "[ar:" (echo.!p1!!p2!>>"%filename%.tmp" & goto:washeader)  
if "!p1:~0,4!" equ "[al:" (echo.!p1!!p2!>>"%filename%.tmp" & goto:washeader)  
if "!p1:~0,4!" equ "[by:" (echo.!p1!!p2!>>"%filename%.tmp" & goto:washeader)  
echo.!p1:.=:!!p2!>>"%filename%.tmp"  
:washeader
)
move /y "%filename%.tmp" "%filename%"  

miniversum
Member: Avatarius
Avatarius Mar 05, 2008 at 20:19:13 (UTC)
Goto Top
Hallo miniversum

Also die doppelten Eointräge am Anfang sind weg.

Habe " :washeader " aus der FOR-Schleife rausgeholt und nach die Klammer gestellt, da es sonst gar nichts gemacht hat.
Kriege allerdings folgende rückgabe:
p1:.=:
p1:.=:
p1:.=:
p1:.=:
p1:.=:Text1
p1:.=:Text2

Die leerzeilen klappen auch noch nicht.
Ersetze ich nun den punkt bei echo

echo.!p1:.=:!!p2!>>"%filename%.tmp

mit einem leerzweichen, fehlen in der rückgabe die ersten 4 zeichen jeder zeile.
Komme leider nicht dahinter an was es liegen könnte.

norbert
Member: miniversum
miniversum Mar 06, 2008 at 09:09:42 (UTC)
Goto Top
So das hier mößte gehen. Bei meinem Tet ging es jedenfalls:
@echo off & setlocal enabledelayedexpansion
set "Filename=Dateiname.txt"  
if exist "%filename%.tmp" del "%filename%.tmp"  
FOR /F "tokens=1,2,3* delims=:]" %%a in ('findstr /N .* "%Filename%"') do  (  
echo [%%a][%%b][%%c][%%d]
set p1=%%b:%%c]
set p2=%%d
set "line= !p1:.=:!!p2!"  
if "!p1:~0,4!" equ "[enc" set "line= !p1!!p2!"  
if "!p1:~0,4!" equ "[ti:" set "line= !p1!!p2!"  
if "!p1:~0,4!" equ "[ar:" set "line= !p1!!p2!"  
if "!p1:~0,4!" equ "[al:" set "line= !p1!!p2!"  
if "!p1:~0,4!" equ "[by:" set "line= !p1!!p2!"  
if "!p1:~0,4!" equ "[off" set "line= !p1!!p2!"  
if "!line!" equ " :]" set "line=."  
echo!line!>>"%filename%.tmp"  
)
move /y "%filename%.tmp" "%filename%"  

miniversum
Member: Avatarius
Avatarius Mar 06, 2008 at 12:58:53 (UTC)
Goto Top
Hallo miniversum,

vielen Dank klappt wunderbar,
Kann man eine doppelte For Schleife realisieren?
Habe eine 2te Datei geschrieben, die die dateinamen an die erste zum ersetzen übergibt, damit klappt es, frage mich allerdings ob das eleganter geht.

1 Datei:
@echo off & setlocal enabledelayedexpansion
FOR %%d in (*.txt *.lrc) do (
set "Filename=C:\test\%%d"  
CALL 2Ersetzen.BAT Filename
)
2 Datei
Dein obiger code ohne
set "Filename=Dateiname.txt"  

Bin echt begeistert , das das so schnell gelöst werden konnte. vielen Dank nochmal.
norbert
Member: miniversum
miniversum Mar 06, 2008 at 14:13:25 (UTC)
Goto Top
Ja klar.
Ich wollte eben erst testen ob es mit einer Datei richtig geht bevor man alle macht.
Es geht genauso wie du es geamcht hast, allerdings kannst du gleich alles in eine Datei packen.
@echo off & setlocal enabledelayedexpansion
FOR %%e in (*.txt *.lrc) do (
if exist "%%e.tmp" del "%%e.tmp"  
FOR /F "tokens=1,2,3* delims=:]" %%a in ('findstr /N .* "%%e"') do  (  
echo [%%a][%%b][%%c][%%d]
set p1=%%b:%%c]
set p2=%%d
set "line= !p1:.=:!!p2!"  
if "!p1:~0,4!" equ "[enc" set "line= !p1!!p2!"  
if "!p1:~0,4!" equ "[ti:" set "line= !p1!!p2!"  
if "!p1:~0,4!" equ "[ar:" set "line= !p1!!p2!"  
if "!p1:~0,4!" equ "[al:" set "line= !p1!!p2!"  
if "!p1:~0,4!" equ "[by:" set "line= !p1!!p2!"  
if "!p1:~0,4!" equ "[off" set "line= !p1!!p2!"  
if "!line!" equ " :]" set "line=."  
echo!line!>>"%%e.tmp"  
)
move /y "%%e.tmp" "%%e"  
)

Ichabe einfach überalle %filename% durch das %%e ersetzt und die erste FOR Schleife um alle gemacht.