mit Batchdatei Zeile in Textdatei finden überspringen und ersetzen
Hallo liebe Gemeinde,
ich weiß zu dem Thema wurde schon einiges verfasst ich habe aber nichts wirklich passendes gefunden. Da ich absoluter Anfänger auf diesem Gebiet bin hoffe ich auf eure Hilfe. Eigentlich würde ich das Problem mit einem kleinen Fortran Programm lösen hier besteht allerdings der Zwang eine Batchdatei zu benutzen.
Meine Problemstellung ist folgende:
Über eine Batchdatei möchte ich eine Textdatei (besteht aus Zeilen mit maximal 80 Zeichen / Zeile) einlesen und gleichzeitig in eine neue Datei rausschreiben. Wenn im Text ein vordefinierter 80 Zeichen langer String gefunden wird soll nach einer definierten Anzahl von Zeilen eine Zeile durch eine andere ersetzt werden.
Ich würde mich freuen wenn ihr mir hier Tipps geben könntet.
Viele Grüße
Oliver
ich weiß zu dem Thema wurde schon einiges verfasst ich habe aber nichts wirklich passendes gefunden. Da ich absoluter Anfänger auf diesem Gebiet bin hoffe ich auf eure Hilfe. Eigentlich würde ich das Problem mit einem kleinen Fortran Programm lösen hier besteht allerdings der Zwang eine Batchdatei zu benutzen.
Meine Problemstellung ist folgende:
Über eine Batchdatei möchte ich eine Textdatei (besteht aus Zeilen mit maximal 80 Zeichen / Zeile) einlesen und gleichzeitig in eine neue Datei rausschreiben. Wenn im Text ein vordefinierter 80 Zeichen langer String gefunden wird soll nach einer definierten Anzahl von Zeilen eine Zeile durch eine andere ersetzt werden.
Ich würde mich freuen wenn ihr mir hier Tipps geben könntet.
Viele Grüße
Oliver
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 126255
Url: https://administrator.de/forum/mit-batchdatei-zeile-in-textdatei-finden-ueberspringen-und-ersetzen-126255.html
Ausgedruckt am: 15.05.2025 um 04:05 Uhr
15 Kommentare
Neuester Kommentar

servus,
auch wenn es bestimmt schon Beispiele gibt - ein kleiner Tipp.
jetzt schaust du dir das mal an, schreibst das irgendwo hin und läßt es laufen.
Gruß
edit
Auf Wunsch unseres Bastlas war ich etwas großzügiger bei der vergabe des Zeichens >
Dem Biber mag ich auch nicht widersprechen, allerdings sind die onleiner eher was für hardliner wie Ihn
*flitz*
auch wenn es bestimmt schon Beispiele gibt - ein kleiner Tipp.
rem Testumgebung schaffen
if not exist c:\bsp md c:\bsp
for /L %%a in (1,1,9) do echo %%a >>C:\bsp\123.ini
rem das was du wolltest...
for /F %%i in (C:\bsp\123.ini) do (if not %%i==7 (
echo %%i>>C:\bsp\ini.ini
) else (
echo ja >>C:\bsp\ini.ini && exit
))
jetzt schaust du dir das mal an, schreibst das irgendwo hin und läßt es laufen.
Gruß
edit
Auf Wunsch unseres Bastlas war ich etwas großzügiger bei der vergabe des Zeichens >
Dem Biber mag ich auch nicht widersprechen, allerdings sind die onleiner eher was für hardliner wie Ihn
*flitz*
Hallo OliverNeu und willkommen im Forum!
Auch von mir noch ein Anhaltspunkt: Mit
lässt sich vorweg prüfen, ob der gesuchte String enthalten ist und sich auch dessen Zeilennummer ermitteln.
Grüße
bastla
P.S.: @timobeil: Zeile 3 könnte noch ein ">" mehr vertragen ...
Auch von mir noch ein Anhaltspunkt: Mit
set Zeile=
for /f "tokens=1* delims=:" %%i in ('findstr /n /c:"vordefinierter 80 Zeichen langer String" "Textdatei"') do set "Zeile=%%i"
if not defined Zeile echo "vordefinierter 80 Zeichen langer String" nicht gefunden & goto :eof
::Datei wird verarbeitet
Grüße
bastla
P.S.: @timobeil: Zeile 3 könnte noch ein ">" mehr vertragen ...
Hallo OliverNeu!
Etwas zum Testen:
Die ursprüngliche Datei bleibt mit dem Zusatz ".bak" als Sicherung erhalten - wenn Du das nicht möchtest, die beiden ":" am Beginn der Zeile 14 entfernen.
Da ich nicht genau wusste, wie "blank" zu verstehen ist, musst Du die Zeile 6 diesbezüglich selbst anpassen.
Grüße
bastla
Etwas zum Testen:
@echo off & setlocal
set "File=D:\IniFile.ini"
set "Bak=%File%.bak"
set "Crit1=*PART"
set "Crit2=$ HEADING"
set "Crit3=blank"
set /a NoOfCriteria=3
set /a LineToChange=5
set "Append=+++++++++++++++1"
set /a Found=0
move "%File%" "%Bak%"
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Bak%"') do set "Line=%%j" & call :ProcessLine
::del "%Bak%"
goto :eof
:ProcessLine
if %Found% geq %NoOfCriteria% goto :Count
set /a NoC=%Found%+1
call set "C=%%Crit%NoC%%%"
if "%Line%"=="%C%" (set /a Found=%NoC%) else (set /a Found=0)
goto :WriteLine
:Count
set /a Found+=1
if %Found%==%LineToChange% (
set "Line=%Line%%Append%"
set /a Found=0
)
:WriteLine
>>"%File%" echo\%Line%
goto :eof
Da ich nicht genau wusste, wie "blank" zu verstehen ist, musst Du die Zeile 6 diesbezüglich selbst anpassen.
Grüße
bastla
Moin OliverNeu,
da du ja nun schon seit einer Woche am Testen bist mal die Nachfrage:
Gib doch mal Feedback bitte.
Danke
Biber
da du ja nun schon seit einer Woche am Testen bist mal die Nachfrage:
- Wo klemmt es denn?
- Können wir irgendwie irgendwo unterstützen?
- Oder sollen wir deinen Nick von "OliverNeu" in "OliverSchonVielRuhiger" ändern lassen?
- Oder funktioniert jetzt alles?
Gib doch mal Feedback bitte.
Danke
Biber
Hallo OliverNeu!
wobei
Analog kannst Du andere Teilstrings bilden, wobei sogar (durch negatives Vorzeichen) vom Ende des Strings gezählt werden kann - Beispiel:
Hier werden vom Inhalt der Variablen %date% ab dem 4. Zeichen von rechts alle (daher ist keine zusätzliche Längenangabe erforderlich) Zeichen verwendet - ergibt hier das aktuelle Jahr (wenn das Datum das Jahr vierstellig angezeigt wird). Nachzulesen ist das Ganze in der Onlinehilfe (zB
Du musst natürlich dafür sorgen, dass %Append% tatsächlich genau 10 Zeichen enthält.
Grüße
bastla
=> Ist es möglich die Zeichenkette bei einer definierten Anzahl (z.B. 60) abzuschneiden und dann den neuen String dranhängen?
Mit CMD können Teilstrings gebildet werden - um also die ersten 60 Zeichen der betreffenden Zeile zu verwenden und daran den in der Variablen %Append% gespeicherten String anzufügen, müsste die Zeile 26 so aussehen:set "Line=%Line:~0,60%%Append%"
%Line:~0,60%
bedeutet: Überspringe vom Anfang weg 0 Zeichen (= beginne ganz am Anfang) und verwende dann die nächsten 60 Zeichen.Analog kannst Du andere Teilstrings bilden, wobei sogar (durch negatives Vorzeichen) vom Ende des Strings gezählt werden kann - Beispiel:
echo %date:~-4%
set /?
).=> Oder besser / allgemeiner ist es möglich die Zeile von - bis zu editieren (z.B. von 61 - 70)?
Um die Zeichen 61 bis 70 auszutauschen (durch den Inhalt der Variablen %Append% zu ersetzen) musst Du zwei Teile der ursprünglichen Zeile verwenden: Die ersten 60 Zeichen und alles nach dem 70. Zeichen - demzufolge:set "Line=%Line:~0,60%%Append%%Line:~70"
Grüße
bastla
Moin OliverNeu,
wenn Du, wie in deinem Anwendungsfall, im Batch "Variablen in Variablen" benötigst (oder benötigen willst), dann muss naturgemäß ein Teil dieser Variablen zuerst, ein anderer "danach", also verzögert (neudeutsch: delayed) aufgelöst werden.
Dieses teilst Du dem CMD-Interpreter durch die Direktive SetLocal EnableDelayedExpansion mit und kannst dann die Feinsteuerung, welcher Variablenteil sofort und welcher verzögert aufgelöst werden soll durch diese Schreibweise angeben:
Variable %var% in der Schreibweise %var%: Wird sofort aufgelöst
Variable %var% in der Schreibweise !var! : Wird verzögert aufgelöst.
Zu abstrakt? Dann als Beispiel am CMD-Prompt (das erste Zeichen ">" nicht mit eingeben; ist mein Prompt)
Anmerkung. Bei meinem Rechner ist "Setlocal EnableDelayedExpansion" immer per Registry aktiviert.
In deinem Batchschnipsel sollten diese zwei Worte eingetragen werden.
Grüße
Biber
wenn Du, wie in deinem Anwendungsfall, im Batch "Variablen in Variablen" benötigst (oder benötigen willst), dann muss naturgemäß ein Teil dieser Variablen zuerst, ein anderer "danach", also verzögert (neudeutsch: delayed) aufgelöst werden.
Dieses teilst Du dem CMD-Interpreter durch die Direktive SetLocal EnableDelayedExpansion mit und kannst dann die Feinsteuerung, welcher Variablenteil sofort und welcher verzögert aufgelöst werden soll durch diese Schreibweise angeben:
Variable %var% in der Schreibweise %var%: Wird sofort aufgelöst
Variable %var% in der Schreibweise !var! : Wird verzögert aufgelöst.
Zu abstrakt? Dann als Beispiel am CMD-Prompt (das erste Zeichen ">" nicht mit eingeben; ist mein Prompt)
>Set "line=super jetzt funktioniert es genau so wie ich es brauche. Ich bin echt begeistert was mit Batch"
>set /a "von=61,bis=70" & set "toAppend=##########"
(= 9:39:45 D:\temp=)
>echo !line:~%von%,-1!%toAppend%!line:~%bis%!
bin echt begeistert was mit Batc##########begeistert was mit Batch
Anmerkung. Bei meinem Rechner ist "Setlocal EnableDelayedExpansion" immer per Registry aktiviert.
In deinem Batchschnipsel sollten diese zwei Worte eingetragen werden.
Grüße
Biber