weboadmix
Goto Top

Batch zum ändern einer Textdatei

Hallo zusammen,

suche hier etwas verzweifelt nach Hilfe, um mit einer Batchdatei eine Textdatei zu durchsuchen und eine Zeile zu ändern.

An und für sich kein Problem, das besorndere scheint nur zu sein, dass der Wert der Variable die gesucht wird ein Gleichheitszeichen beinhaltet.

Etwas genauer:

Ich habe eine Textdatei, die folgendermaßen aufgebaut ist:

Hubert=1
Josef=0
Gerd=0
Inge=1
Walter=1

und so weiter, ingesamt 9 Zeilen.

Nun soll die Batchdatei die Zeilen nach "Hubert=1" durchsuchen und in "Hubert=0" verändert.


Meine bisherigen Versuche sehen so aus:

REM @ECHO off
SETLOCAL enabledelayedexpansion



SET "quell_datei=C:\data.txt"  
SET "ziel_datei=C:\data.txt"  
SET "suchen_nach=Hubert=1"  
SET "ersetzen_durch=Hubert=0"  

REM Ausgabe einer Fehlermeldung und Programmabbruch
REM falls die Variable "suchen_nach" nicht definiert ist  
IF NOT DEFINED suchen_nach (ECHO Fehler: Die Variable suchen_nach nicht definiert^^!&GOTO :eof)

REM Loeschen der Ausgabedatei, falls sie (noch) existiert
REM IF EXIST %ziel_datei% (DEL /f %ziel_datei% 1>NUL 2>NUL)

REM Quell-Datei zeilenweise auslesen 
REM und in Variable "zeile" schreiben  
FOR /f "delims=" %%i IN ('FINDSTR . "%quell_datei%"') DO (  
SET zeile=%%i& CALL :ersetzen !zeile!
)
GOTO :weiter
:ersetzen
REM innerhalb der Variable "zeile"  
REM den Inhalt der Variable "suchen_nach" suchen  
REM und diese durch den Inhalt der Variable "ersetzen_durch" ersetzen  
SET zeile=!zeile:%suchen_nach%=%ersetzen_durch%!

REM Inhalt der Variable "zeile" in die Ausgabedatei schreiben  
IF [!zeile!] EQU  (ECHO.>>%ziel_datei%) ELSE (ECHO !zeile!>>%ziel_datei%)

GOTO :eof


:weiter
REM weitere Verarbeitung


ECHO Fertig^^!



Das Ergebis liefert dann leider in der ersten Zeile: "1=Hubert=01".


Was mache ich falsch?????

Wenn das nicht gehen sollte, wäre es vielleicht möglich, die Zeile 1 stumpf mit dem vorgegebenen Wert "Hubert=0" austzutauschen, ohne Vergleich und Schleife?


Wenn ich die Batch ein zweites oder dritttes mal laufen lasse, werden die Zeilen in der Ausgabedatei immer unten dran gehangen, so dass die Datei immer größer wird.

Kann man das auch ändern?


Wäre sehr nett, wenn mir hier jemand kurz weiterhelfen könnte!!


[Edit Biber] Codeformatierung. [/Edit]

Content-Key: 230296

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

Printed on: April 23, 2024 at 11:04 o'clock

Member: bastla
Solution bastla Feb 18, 2014 updated at 20:15:33 (UTC)
Goto Top
Hallo weboadmix und willkommen im Forum!
wäre es vielleicht möglich, die Zeile 1 stumpf mit dem vorgegebenen Wert "Hubert=0" austzutauschen
Sollte sich so machen lassen:
@echo off & setlocal
SET "quell_datei=C:\data.txt"  
SET "ziel_datei=C:\data.txt"  

 >"%ziel_datei%" echo Hubert=0  
>>"%ziel_datei%" more +1 "%quell_datei%"  
Grüße
bastla
Member: weboadmix
weboadmix Feb 18, 2014 at 20:18:13 (UTC)
Goto Top
Hallo bastla,

vielen Dank für die schnelle Antwort.

Habe es zwischenzeilich so hinbekommen:


@echo off

SETLOCAL enabledelayedexpansion

set In=C:\data.txt
set Out=C:\data_temp.txt
set Line=1
set NewText=Hubert=0

Type Nul >%Out%
for /f "tokens=1* delims=:" %%A in ('findstr /N "^" "%In%"') do if %%A==%Line% (>>%Out% echo/%NewText%) else (>>%Out% echo/%%B)

MOVE C:\data_temp.txt C:\data.txt


Da eine umbenennung der bereits existierenden Datei nicht möglich ist, habe ich mir mir dem Befehl MOVE geholfen.


Und, es funktioniert alles wie gewünscht.

Viele Grüße!
Member: feadin
feadin Feb 21, 2014 at 15:49:10 (UTC)
Goto Top
Hallo zusammen!

Habe hier ein ähnliches Problem:

Ich versuche, per batch-Datei HTML-Tags aus einer .txt-Datei zu entfernen, habe dazu folgendes Skript kopiert und angepasst.
Das soll später, wenn es grundsätzlich funktioniert um viele weitere Tags erweitert werden, bislang scheint es aber so, als ob das Skript gar nichts tut
und ich habe keine Ahnung wo der Fehler liegen könnte.

hier der Code:
@echo off & setlocal enabledelayedexpansion 

set "Datei=D:\Reportbereinigung\Test-Kopie.txt"    
set "t=Temp.tmp"    

set "Ersetzen="  
set "Tag001=<HTML>"   
set "Tag002=<TR><TD width="175">&nbsp;</TD><TD class="value">"   
 
if exist "%t%" del "%t%"   
for /f "delims=" %%i in ('findstr /n $ "%Datei%"') do set "Line=%%i" & call :ProcessLine   
move "%t%" "%Datei%"   
goto :WEITER_IM_BATCH 

:ProcessLine 
for /f "tokens=1* delims=:" %%a in ("%Line%") do set "L=%%b"   
if not defined L >>"%t%" echo\& goto :eof   

set WriteLine1=!L:%Tag001%=%Ersetzen%! 
set WriteLine2=!WriteLine1:%Tag002%=%Ersetzen%! 

>>"%t%" echo !WriteLine2!   
goto :eof 

:WEITER_IM_BATCH 

Wäre echt dankbar, wenn mir jemand weiterhelfen könnte ;)
Member: bastla
bastla Feb 21, 2014 updated at 21:38:18 (UTC)
Goto Top
Hallo feadin und willkommen im Forum!

Die Ähnlichkeit Deiner Problemstellung hält sich zwar in Grenzen, aber anyhow: Mit Batch würde ich mir das (wegen der Anführungs- und Sonderzeichen) aber eher nicht antun wollen, sondern eher zu VBS greifen - das könnte dann etwa so gehen:
Datei = "D:\Reportbereinigung\Test-Kopie.txt"  

Suchen = Array( _
    "<HTML>", _  
    "<TR><TD width=""175"">&nbsp;</TD><TD class=""value"">" _  
)

Ersetzen = Array( _
    "", _  
    "" _  
)

If UBound(Suchen) > UBound(Ersetzen) Then
    WScript.Echo "Zu wenig Ersetzungsbegriffe!"  
    WScript.Quit
End If

Set fso = CreateObject("Scripting.FileSystemObject")  

T = fso.OpenTextFile(Datei).ReadAll
For i = 0 To UBound(Suchen)
    T = Replace(T, Suchen(i), Ersetzen(i))
Next

fso.CreateTextFile(Datei).Write T
Die Ersetzung wird hier "in der Datei" vorgenommen, es wird also die Datei unmittelbar (ohne Temporärdatei / Sicherungskopie) verändert.

Kurz zur Erklärung der Zeilen 3 - 6 bzw 8 - 11: Du kannst mehrere Paare von Such- und Ersetzungsbegriffen angeben, wobei außer beim jeweils letzten Eintrag immer ein Komma und ein Unterstrich am Ende der Zeile stehen müssen (Zeilen 4 und 9); nach den letzten Werten (Zeilen 5 und 10) ist kein Komma zu setzen.

Für jeden Suchbegriff muss auch ein Ersetzungsbegriff existieren (auch, wenn wie hier, jeweils durch "Nichts" ersetzt werden soll).

Anführungszeichen, die Bestandteil des Such- oder Ersetzungsbegriffes sind, müssen verdoppelt werden.

Grüße
bastla
Member: feadin
feadin Feb 25, 2014 at 10:10:26 (UTC)
Goto Top
Vielen Dank für die schnelle und kompetente Hilfe face-smile

Das funktioniert prima und mich einen großen Schritt weiter gebracht.
Und es hat mich dazu gebracht, mich ein bisschen mit VBS auseinanderzusetzen,
bislang hatte ich damit keine Berührung^^


Nochmal Danke und viele Grüße

Feadin