bodor21
Goto Top

Batch Datei zum Suchen und Ersetzen in einer Textdatei die ein ! enthält

Hallo,

ist mal wieder eine Frage zu Suche und ersetzten. Einige Beispiele aus älteren Beiträgen funktionieren, nur das ! (Ausrufezeichen) verschwindet in der ausgegebenen Datei.

In der Datei Test.txt sind mehrere Zeilen , die so aussehen:

.
.
:Polizei=NOTRUF110,Region=1340,NR=22273,Breite=E341CC0!
:Polizei=NOTRUF110,Region=1540,NR=27873,Breite=E362CC0!

Mit der folgenden Batch funktioniert es, nur das ! (Ausrufezeichen) wird in der ausgegebenen Datei gelöscht.
Das ! (Ausrufezeichen) soll ausserdem noch in ein ; (Semikolon) ersetzt werden, wie geht das.


@echo off & setlocal enabledelayedexpansion
set "Datei=D:\Test.txt"   
set "Von=:Polizei"  
set "Nach=Waehle:Polizei"  
set "t=%temp%\text.tmp"   
if exist "%t%" del "%t%"   
for /f "usebackq delims=" %%i in ("%Datei%") do set "Line=%%i" & set Line=!Line:%Von%=%Nach%! & echo !Line!>>"%t%"   
move /y "%t%" "%Datei%"  


Das Ergebnis sollte so aussehen:

Waehle:Polizei=NOTRUF110,Region=1340,NR=22273,Breite=E341CC0;
Waehle:Polizei=NOTRUF110,Region=1540,NR=27873,Breite=E362CC0;

Danke für die Hilfe eines Anfängers

MfG

bodor

Content-Key: 118497

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

Printed on: April 16, 2024 at 13:04 o'clock

Member: LAMPE1962
LAMPE1962 Jun 18, 2009 at 14:26:04 (UTC)
Goto Top
Hallo Bodor, mach Dir nicht das Leben schwer mit Batch. Gehe auf http://www.inforapid.de/ , lade Dir "Suchen&Ersetzten runter, und los gehts.

Gruß
Stefan
Member: bodor21
bodor21 Jun 18, 2009 at 14:35:54 (UTC)
Goto Top
Hallo Stefan,

leider muss ich das in eine andere Batch Datei einbinden , kann das og. Programm also nicht installieren.


Danke für die schnelle Antwort

MfG

bodor
Member: bastla
bastla Jun 18, 2009 at 14:55:04 (UTC)
Goto Top
Hallo bodor21 und willkommen im Forum!

Sollte so gehen:
@echo off & setlocal
set "Datei=D:\Test.txt"   
set "Von=:Polizei"  
set "Nach=Waehle:Polizei"  

set "t=%temp%\text.tmp"   
if exist "%t%" del "%t%"   
for /f "usebackq delims=" %%i in ("%Datei%") do set "Line=%%i" & call :ProcessLine  
move "%t%" "%Datei%"  
goto :eof

:ProcessLine
call set "Line=%%Line:%Von%=%Nach%%%"  

::Ersetzung "!" durch ";" 
set "Line=%Line:!=;%"  

>>"%t%" echo %Line%  
goto :eof
Grüße
bastla
Member: Biber
Biber Jun 18, 2009 at 15:14:33 (UTC)
Goto Top
Moin bodor21,

willkommen im Forum.
Wenn eine Lösung des eigentlichen Problems gefragt ist (Strings mit enthaltenenem "!" sind ein bisschen zickig in Verbindung mit DelayedExpansion), dann wäre die Antwort:
  • Benutze "DelayedExpansion" nur "local", da, wo es auch benötigt wird.

@echo off & setlocal disabledelayedexpansion
set "Datei=D:\Test.txt" set "Von=:Polizei"  
set "Nach=Waehle:Polizei"  
:: set "t=%temp%\text.tmp"  
set "t=con:"  
if exist "%t%" del "%t%"   
for /f "usebackq delims=" %%i in ("%Datei%") do set "line=%%i" & call :ProcessLine  
goto :eof

:ProcessLine -- keine Parameter --
   :: solange keine DelayedExpansion gesetzt: Ausrufezeichen ersetzen
   Set "Line=%Line:!=;%"  
   setlocal Enabledelayedexpansion
   set Line=!Line:%Von%=%Nach%! 
   echo %Line%>>"%t%"   
   echo [auf echo gesetzt] move /y "%t%" "%Datei%"  
   Endlocal
goto :eof

Grüße
Biber
Member: bodor21
bodor21 Jun 18, 2009 at 20:01:57 (UTC)
Goto Top
Hallo Biber,

ist genau das was ich brauche --> DANKE

Eine Frage habe ich aber doch noch

Wie kann ich jede Zeile in meiner Test.txt ab einen bestimmten Wort bis zum Zeilenende löschen.
Das Wort heist: ,Breite
Die Zeilen in der Test.txt sind nicht gleichlang.

Vorher
:Polizei=NOTRUF110,Region=1540,NR=27873,Breite=E362CC0!
:Polizei=NOTRUF110,Region=1540,NR=27874553,Breite=E362C78C0!

nachher

:Polizei=NOTRUF110,Region=1540,NR=27873
:Polizei=NOTRUF110,Region=1540,NR=27874553

MfG

bodor
Member: bastla
bastla Jun 18, 2009 at 20:09:54 (UTC)
Goto Top
Hallo bodor21!

Falls Du auch eine Anwort von mir akzeptierst, dann (ungetestet und unter der Voraussetzung, dass die Datensätze in jeder Zeile den gleichen Aufbau und Kommata als Trennzeichen haben):
@echo off & setlocal
set "Datei=D:\Test.txt"   

set "t=%temp%\text.tmp"   
if exist "%t%" del "%t%"   
for /f "usebackq tokens=1-3 delims=," %%i in ("%Datei%") do >>"%t%" echo %%i,%%j,%%k  
move "%t%" "%Datei%"  
Grüße
bastla
Member: Biber
Biber Jun 18, 2009 at 20:19:47 (UTC)
Goto Top
Moin bodor21,

ich würde an Deiner Stelle die Strategie überdenken und nicht mehr zeilenweise denken sonder eher feldweise.

Es scheint ja nur eine endliche Anzahl von "Feldern" in einer Zeile vorkommen zu können, wenn wir als Feldtrenner ein "," annehmen.
[ja, dass die Zeile mit ":" beginnt und mit "!" endet, habe ich wahrgenommen].

Dennoch bleiben x "Felder" mit dem Muster "whatever=wert" zwischen den Trennern "," übrig.

Beispiel am CMD-Prompt:
>for /f "delims=, tokens=1-4" %i in (":Polizei=NOTRUF110,Region=1540,NR=27873,Breite=E362CC0!") do @echo 1[%i] 2[%j] 3[%k] 4[und nicht: %l]  
1[:Polizei=NOTRUF110] 2[Region=1540] 3[NR=27873] 4[und nicht: Breite=E362CC0!]

Jedes dieser einzelnen "Felder" oder auf bätchisch "Token" %i, %j %k..... kannst Du wiederum in zwei Token "whatever" und "wert" zerlegen,
wenn Du in einer zweiten Runde als "Delims==" und "token=1,2" angibst.

Dann kannst Du auch prüfen, ob dieses whatever-token gleich "Breite" heißt und damit umgehen.

Grüße
Biber

[Edit] @bastla
wenn Du auch eine Antwort von mir akzeptierst..
Ich würde keine Antworten von Rechtsüberholern akzeptieren ... face-wink
[/Edit]
Member: bodor21
bodor21 Jun 18, 2009 at 21:02:36 (UTC)
Goto Top
Hallo Ihr Antworter,

natürlich akzeptiere ich Antworten von Jeden, der mir helfen möchte face-smile)

Die Datei enthält glücklicherweise nur Datensätze mit "," als Texttrenner und es gibt Zeilen mit 2 unterschiedlichen Feldanzahl.
Da brauche ich den CMD-Promt nur 2 mal mit den unterschiedlichen Tokenanzahl durchlaufen lassen.

Werd ich dann morgen mal testen

Danke @all

MfG

bodor21

... wer lesen kann ist klar im Vorteil
Member: bodor21
bodor21 Jun 28, 2009 at 20:45:44 (UTC)
Goto Top
Hallo

der Test mit den Zeilenende habe ich nicht durchgeführt, da das mir als Unwissender doch etwas kompliziert ist, bzw. ich z.Z. keine Zeit habe mich da reinzuarbeiten.
Ich lösche den Rest mit der Hand, ist bei 60 bis 150 Zeilen n o c h ... zu vertreten.

Das Suchen und ERsetzten ist auf jeden Fall voll funktionsfähig und somit gelöst.

D A N K E

MfG

bodor21