busfahrer
Goto Top

Datum bzw. Textstellen in drei TXT-Datei ändern (automatisch oder manuell)

Hallo zusammen,

ich habe folgendes Problem:
ich muss/soll/will in drei TXT-Datei einen gewissen Wert (in dem Fall das Datum (JJJMMTT)) ändern:
Entweder, dass man das Datum beim Starten des Batches eingeben kann, oder dass das aktuelle Datum automatisch in die Datei geschrieben wird.

Die Datei sieht z. B. folgendermaßen aus:
.
.
.
rt60_asta*_1.*:rt60_asta_20080409_001.pdf
rt60_asta*_2.*:rt60_asta_20080409_002.pdf
rt60_asta*_3.*:rt60_asta_20080409_003.pdf
rt60_asta*_4.*:rt60_asta_20080409_004.pdf
.
.
.
Es werden die Positionen z. T. erweitert bzw. es kommen neue hinzu.

Meine letzten Batch-Programmierungen (simple) liegen schon einige Jahre zurück.
Hat mir jemand einen Tipp bzw. einen Ansatzpunkt?

Der Inhalt der Zeile darf nicht verändert werden (außer das Datum natürlich face-wink )
da diese Datei für die Umbenennung mehrerer Dateien dient.

Vielen Dank schon mal im Voraus.

Gruß,
Tom

Content-Key: 85458

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

Ausgedruckt am: 29.03.2024 um 10:03 Uhr

Mitglied: bastla
bastla 14.04.2008 um 15:29:10 Uhr
Goto Top
Hallo Busfahrer und willkommen im Forum!

Soferne die Ersetzung für jede Zeile erfolgen soll und die Struktur der einzelnen Zeilen (hinsichtlich des Trennzeichens "_" und der sich daraus ergebenden Position des Datums als 5. Bestandteil) immer gleich ist, etwa so:
@echo off & setlocal
set "Datei=D:\Textdatei.txt"  
set "Bak=%Datei%.bak"  
move "%Datei%" "%Bak%"  

set /p "Datum=Bitte das Datum im Format JJJJMMTT eingeben: "  
if defined Datum goto :DoIt
set "Datum=%date:~-4%%date:~-7,2%%date:~-10,2%  

:DoIt
for /f "usebackq tokens=1-5* delims=_" %%a in ("%Bak%") do echo %%a_%%b_%%c_%%d_%Datum%_%%f>>"%Datei%"  
Die Eingabe des Datums wird nicht weiter geprüft - nur, falls keine Eingabe erfolgte, wird das heutige Datum verwendet.

Die Originaldatei bleibt als Kopie namens "Dateiname.Typ.bak" erhalten.
Generell ist allerdings anzumerken, dass für Ersetzungen besser ein Tool wie etwa "sed" oder zumindest VBScript zu empfehlen wäre, da Batch für das Behandeln von einzelnen Zeichen/Teilstrings nur bedingt geeignet ist.

Grüße
bastla
Mitglied: Busfahrer
Busfahrer 14.04.2008 um 21:04:11 Uhr
Goto Top
Hallo bastla,

Vielen Dank für die schnelle Hilfe.

Die Batch funktioniert soweit.
Das Problem ist, dass ich drei TXT-Dateien habe mit, im Prinzip, gleichen Inhalt, aber anderem Dateinamen.

Ich hab mir auch mal "sed" angeschaut. Blick da blos noch nicht ganz durch...

Puh, am Besten ich fang glaub nochmal bei null an.
Hab mich seit über 10 Jahren nicht mehr mit Batch schreiben beschäftigt.


Ich hab im Netz nichts wirklich brauchbares zu meinem Problem gefunden.
Deshalb versuche ich es hier mal.

Danke.

Gruß,
Tom
Mitglied: bastla
bastla 14.04.2008 um 21:46:07 Uhr
Goto Top
Hallo Busfahrer!

Für 3 Dateien brauchen wir noch ein Unterprogramm:
@echo off & setlocal

set /p "Datum=Bitte das Datum im Format JJJJMMTT eingeben: "  
if defined Datum goto :DoIt
set "Datum=%date:~-4%%date:~-7,2%%date:~-10,2%  

:DoIt
for %%i in ("D:\Textdatei1.txt" "D:\Textdatei2.txt" "D:\Textdatei3.txt") do call :ProcessFile "%%~i"  
goto :eof

:ProcessFile
set "Datei=%~1"  
set "Bak=%Datei%.bak"  
move "%Datei%" "%Bak%"  

for /f "usebackq tokens=1-5* delims=_" %%a in ("%Bak%") do echo %%a_%%b_%%c_%%d_%Datum%_%%f>>"%Datei%"  
goto :eof
Zu "sed": Für eine Deiner Dateien ginge das etwa so:
move "D:\Textdatei1.txt" "D:\Textdatei1.txt.bak" & sed 's/20080409/20080414/g' "D:\Textdatei1.txt.bak">"D:\Textdatei1.txt"  
Anmerkung: Die Anführungszeichen sind in diesem Beispiel alle überflüssig, aber schaden nicht, und sollten Leerzeichen in Pfad- oder Dateinamen ins Spiel kommen, brauchst Du sie tatsächlich.

"sed"-Info: Du könntest zB hier beginnen (und Dir vor allem auch die sedFAQ ansehen) ...

Grüße
bastla
Mitglied: Busfahrer
Busfahrer 16.04.2008 um 08:11:36 Uhr
Goto Top
Hallo bastla,

Batch funktioniert soweit wunderbar. Danke dafür.
Jetzt ergibt sich eine andere Schwierigkeit:

In einer neuen Datei sieht der Inhalt jetzt folgendermaßen aus:
.
.
.
rt60_asta*_1.*:plott klein_!!_rt60_asta_20080409_001.pdf
rt60_asta*_2.*:plott klein_!!_rt60_asta_20080409_002.pdf
rt60_asta*_3.*:plott klein_!!_rt60_asta_20080409_003.pdf
rt60_asta*_4.*:plott klein_!!_rt60_asta_20080409_004.pdf
.
.
.
D. h. es kamen nochmal zwei "_" dazu.
Wie kann ich diesen zweiten Prozess in die Batch einarbeiten?
Ich hab mal ein bischen experimentiert, allerdings macht der mir immer nur die erste Datei.
Der Rest wird ignoriert....

Vielen Dank schon mal.

Gruß,
Tom
Mitglied: bastla
bastla 16.04.2008 um 10:17:08 Uhr
Goto Top
Hallo Busfahrer!

Wenn es auch Datumseinträge an Position 7 (anstatt 5) gibt, verwenden wir eben verschiedene Unterprogramme:
@echo off & setlocal

set /p "Datum=Bitte das Datum im Format JJJJMMTT eingeben: "  
if defined Datum goto :DoIt
set "Datum=%date:~-4%%date:~-7,2%%date:~-10,2%  

:DoIt
for %%i in ("D:\Textdatei1.txt" "D:\Textdatei2.txt" "D:\Textdatei3.txt") do call :ProcessFile_5 "%%~i"  
for %%i in ("D:\Textdatei4.txt") do call :ProcessFile_7 "%%~i"  
goto :eof

:ProcessFile_5
set "Datei=%~1"  
set "Bak=%Datei%.bak"  
move "%Datei%" "%Bak%"  

for /f "usebackq tokens=1-5* delims=_" %%a in ("%Bak%") do echo %%a_%%b_%%c_%%d_%Datum%_%%f>>"%Datei%"  
goto :eof

:ProcessFile_7
set "Datei=%~1"  
set "Bak=%Datei%.bak"  
move "%Datei%" "%Bak%"  

for /f "usebackq tokens=1-7* delims=_" %%a in ("%Bak%") do echo %%a_%%b_%%c_%%d_%%e_%%f_%Datum%_%%h>>"%Datei%"  
goto :eof
Nach diesem Prinzip kannst Du auch andere Anordnungen berücksichtigen.
Als Alternative: Doch "sed" verwenden, etwa
@echo off & setlocal

set /p "Datum=Bitte das Datum im Format JJJJMMTT eingeben: "  
if defined Datum goto :DoIt
set "Datum=%date:~-4%%date:~-7,2%%date:~-10,2%  

:DoIt
for %%i in ("D:\Textdatei1.txt" "D:\Textdatei2.txt" "D:\Textdatei3.txt" "D:\Textdatei4.txt") do call :ProcessFile "%%~i"  
goto :eof

:ProcessFile
set "Datei=%~1"  
set "Bak=%Datei%.bak"  
move "%Datei%" "%Bak%"  

"C:\Pfad zu sed\sed" 's/20080409/%Datum%/g' "%Bak%">"%Datei%"  
goto :eof
Damit wird das Datum unabhängig von seiner Position in der Zeile ersetzt.

Grüße
bastal
Mitglied: Busfahrer
Busfahrer 16.04.2008 um 12:51:53 Uhr
Goto Top
Hallo bastla,

Danke dir.
Das Script hat funktioniert!
Ich denke/hoffe ich komme dann damit soweit alleine zurecht, hab ja jetzt ne Vorlage.
Und reinarbeiten in die ganze Geschichte muss ich mich dann ja eh.


Ich kann dir leider nichts dafür geben, außer der Gewissenheit, dass du jemandem sehr geholfen hast face-smile


Gruß,
Tom