oliverneu
Goto Top

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

Content-Key: 126255

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

Printed on: April 19, 2024 at 20:04 o'clock

Member: TsukiSan
TsukiSan Oct 01, 2009 at 15:48:31 (UTC)
Goto Top
Hi Oliverneu,

schau doch mal ganz unten nach! Da findest du viele Beispiele, wie du dein Problem mit batchen lösen kannst.

Gruß
Tsuki
Mitglied: 60730
60730 Oct 01, 2009 at 16:26:23 (UTC)
Goto Top
servus,

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 face-wink

*flitz*
Member: bastla
bastla Oct 01, 2009 at 19:08:18 (UTC)
Goto Top
Hallo OliverNeu und willkommen im Forum!

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
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 ...
Member: Biber
Biber Oct 01, 2009 at 19:14:19 (UTC)
Goto Top
P.S.: @timobeil: Zeile 3 könnte noch ein ">" mehr vertragen ...
...also ich mag Oneliner...auch als .ini-Dateien..
Member: OliverNeu
OliverNeu Oct 02, 2009 at 05:49:54 (UTC)
Goto Top
Erstmal Danke für die schnelle Hilfe!!!!!

Um mein Problem näher zu verdeutlichen. Ich habe eine Textdatei mit sehr vielen Einträgen. Folgend ein Auszug ( + = Leerzeichen):


*PART
$ HEADING
punch
$ ++1PID++2SECID++3MID++4EOSID++5HGID++6GRAV+7ADPORT+++8TMID
4+++++4+++++++4++++++0++++++0
*PART
$ HEADING
blank
$ ++1PID++2SECID++3MID++4EOSID++5HGID++6GRAV+7ADPORT+++8TMID
5++++++5++++++5++++++0++++++0

Ich weiß nicht ob im Batch auch eine verschachtelte if-Anweisung geht denn es müssen drei aufeinanderfolgende Zeilen passen (in dem Fall *PART / $HEADING / blank). Mein Ziel ist es an die Zeile:
5++++++5++++++5++++++0++++++0
folgendes dranzuhängen:
1
so dass folgendes entsteht:
5++++++5++++++5++++++0++++++0+++++++++++++++1
Ich weiß aber nur das die zu editierende Zeile eine Zeile nach *PART / $HEADING / blank folgt.

Weiterhin habe ich das Problem das Freizeichen nicht beachtet werden (es werden nur die ersten zusammenhängenden Zeichen rausgeschrieben.


Viele Grüße

Oliver
Member: bastla
bastla Oct 02, 2009 at 17:41:33 (UTC)
Goto Top
Hallo OliverNeu!

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
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
Member: Biber
Biber Oct 06, 2009 at 20:03:39 (UTC)
Goto Top
Moin OliverNeu,

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? face-wink
  • Oder funktioniert jetzt alles?

Gib doch mal Feedback bitte.

Danke
Biber
Member: OliverNeu
OliverNeu Oct 07, 2009 at 06:25:11 (UTC)
Goto Top
Vielen Vielen Dank erstmal für die Unterstützung!!!!!

Ich hatte noch keine Zeit zu testen. Werde dies aber spätestens morgen tun, und geb dann sofort ein Feedback.

OliverSchonVielRuhiger
Member: OliverNeu
OliverNeu Oct 08, 2009 at 12:20:11 (UTC)
Goto Top
Entschuldige bitte die späte Antwort.

Bis auf einen Punkt funktioniert es super.

Die zu ändernde Zeile sieht folgendermaßen aus:
5++++++5++++++5++++++0++++++0

Allerdings ist jede Zeile 80 Zeichen lang (keine Einträge werden mit Leerzeichen
aufgefüllt).

=> Ist es möglich die Zeichenkette bei einer definierten Anzahl (z.B. 60) abzuschneiden
und dann den neuen String dranhängen?

=> Oder besser / allgemeiner ist es möglich die Zeile von - bis zu editieren (z.B. von 61 - 70)?


Danke für die Hilfe

Oliver
Member: bastla
bastla Oct 08, 2009 at 14:50:21 (UTC)
Goto Top
Hallo OliverNeu!
=> 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%"
wobei %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%
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 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"
Du musst natürlich dafür sorgen, dass %Append% tatsächlich genau 10 Zeichen enthält.

Grüße
bastla
Member: OliverNeu
OliverNeu Oct 09, 2009 at 06:24:23 (UTC)
Goto Top
Hallo bastla,

super jetzt funktioniert es genau so wie ich es brauche. Ich bin echt begeistert was mit Batch
alles geht.

Gruß

Oliver
Member: OliverNeu
OliverNeu Oct 09, 2009 at 06:26:59 (UTC)
Goto Top
An alle,

vielen Dank für eure schnelle und kompetente Unterstützung. Hier habt mir
wirklich sehr geholfen. Das Skript funktioniert wirklich super und ist eine
große Hilfe.


Gruß

Oliver
Member: OliverNeu
OliverNeu Oct 09, 2009 at 07:10:02 (UTC)
Goto Top
Hallo Bastla,

nur noch eins bitte. Ist es möglich das "von" und "bis" variabel zu machen?
Ich hätte gedacht das es so funktionieren sollte:

set /a von=61
set /a bis=70

set "Line=%Line:~0,%von%-1%%Append%%Line:~%bis%%"

Tut es aber nicht. Warum?


Gruß

Oliver
Member: Biber
Biber Oct 09, 2009 at 07:43:11 (UTC)
Goto Top
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)
>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
Member: OliverNeu
OliverNeu Oct 09, 2009 at 08:48:20 (UTC)
Goto Top
Hi Biber,

funktioniert super!
Danke!!!!!


Gruß

Oliver