zeed78
Goto Top

Suchen und ersetzten mit Bedingung

Hallo,

ich muss in einer Datei Zeile für Zeile überprüfen. Ich muss das 2. und 3. "-" durch " " ersetzten, wenn die Zeile mit einem 1. " -" beginnt.

So sieht meine Datei aus (Die Leerzeichen werden leider nicht angezeigt).

56651 xxxxx 11712 09.01.12 265,85 316,36
-56651 xxxxx 11712 09.01.12 -265,85 -316,36
56653 xxxxx 13500 10.01.12 -45,00 -53,55

Also nochmals:

Ich muss die Minusse vor den Beträgen durch ein Leerzeichen ersetzten, wenn die Zeile mit einem Minus beginnt (Vor dem Minus sind 2 Leerzeichen).

In dem Beispiel müssten jetzt die Minusse vor den Zahlen in Zeile 2 durch ein Leerzeichen ersetzt werden. In Zeile 3 müssen die Minusse bleiben.

So sollte es aussehen:

56651 xxxxx 11712 09.01.12 265,85 316,36
-56651 xxxxx 11712 09.01.12 265,85 316,36
56653 xxxxx 13500 10.01.12 -45,00 -53,55


Hab Ihr eine Idee?

Content-Key: 181022

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

Printed on: April 25, 2024 at 18:04 o'clock

Member: Pjordorf
Pjordorf Feb 24, 2012 at 12:50:47 (UTC)
Goto Top
Hallo,

Zitat von @zeed78:
(Die Leerzeichen werden leider nicht angezeigt).
Dann setze diese doch in code tags mit type=plain. Hier nachzulesen Formatting instructions in the posts.
<code "type=plain">
56651 xxxxx 11712 09.01.12 265,85 316,36
-56651 xxxxx 11712 09.01.12 -265,85 -316,36
56653 xxxxx 13500 10.01.12 -45,00 -53,55


Gruß,
Peter
Member: bastla
bastla Feb 24, 2012 at 12:51:35 (UTC)
Goto Top
Hallo zeed78 und willkommen im Forum!

Etwa so:
@echo off & setlocal
set "Ein=D:\Datei1.txt"  
set "Aus=D:\Datei2.txt"  

del "%Aus%" 2>nul  
for /f "usebackq delims=" %%i in ("%Ein%") do set "Zeile=%%i" & call :ProcessLine  
goto :eof

:ProcessLine
if "%Zeile:~,1%" neq "-" (>>"%Aus%" echo %Zeile% & goto :eof)  
set "Zeile=%Zeile:-= %"  
>>"%Aus%" echo -%Zeile:~1%  
goto :eof
Ich habe mal vorausgesetzt, dass es in der Datei keine erhaltenswerten Leerzeilen gibt [Edit] und dass die nicht angezeigten Leerzeichen nicht am Anfang der Zeile stehen [/Edit]...

Grüße
bastla
Member: zeed78
zeed78 Feb 24, 2012 at 14:05:04 (UTC)
Goto Top
Leider sind die Leerzeichen wichtig.


@echo off & setlocal
set "Ein=fibujour"
set "Aus=datei2.txt"

del "%Aus%" 2>nul
for /f "usebackq delims=" %%i in ("%Ein%") do set "Zeile=%%i" & call :ProcessLine
goto :eof

:ProcessLine
if "%Zeile:~,1%" neq "-" (>>"%Aus%" echo %Zeile% & goto :eof)
set "Zeile=%Zeile:-= %"
>>"%Aus%" echo -%Zeile:~1%
goto :eof

Habe ich versucht. Klappt nicht.
Ich würde auch gerne die datei fibujour einfach überschreiben, und keine neu anlegen.
Dazu kommt noch eines, was ich ausgeixt habe sind eigentlich Kurznamen. Diese können auch Sonderzeichen wie "&" oder "," enthalten.
Was mir einen haufen Fehler ausspuckt und die Daten zerhäckselt.
Member: bastla
bastla Feb 24, 2012 at 15:01:28 (UTC)
Goto Top
Hallo zzed78!
Leider sind die Leerzeichen wichtig.
Dann poste doch bitte (damit sich genau feststellen lässt, wo denn nun welche sind), wie schon von Pjordorf vorgeschlagen, die Beispieldatei in der gleichen Formatierung wie den Batch gerade eben ...
Ich würde auch gerne die datei fibujour einfach überschreiben, und keine neu anlegen.
Dazu braucht es ja nur die eine zusätzliche Zeile
move "%Aus%" "%Ein%"
Dazu kommt noch eines, was ich ausgeixt habe sind eigentlich Kurznamen. Diese können auch Sonderzeichen wie "&" oder "," enthalten.
Sollten wir sonst noch etwas wissen? face-wink

[Edit] Unter der Annahme, dass das dritte Zeichen (deswegen "2" in der Zeile 11) vom Beginn der Zeile an zu prüfen ist, sähe das dann so aus:
@echo off & setlocal
set "Ein=fibujour"  
set "Aus=%temp%\fibujour"  

del "%Aus%" 2>nul  
for /f "usebackq delims=" %%i in ("%Ein%") do set "Zeile=%%i" & call :ProcessLine  
move "%Aus%" "%Ein%"  
goto :eof

:ProcessLine
if "%Zeile:~2,1%" neq "-" goto :Ausgabe  
set "Zeile=%Zeile:-= %"  
set "Zeile=  -%Zeile:~3%"  

:Ausgabe
setlocal enabledelayedexpansion
>>"%Aus%" echo %Zeile% & goto :eof  
endlocal
goto :eof
Leerzeilen werden so weiterhin nicht "mitgenommen" ...
[/Edit]

Grüße
bastla
Member: zeed78
zeed78 Feb 24, 2012 at 16:47:23 (UTC)
Goto Top
Erstmal danke. (Das hatte ich vorher ganz vergessen.

1. Die Formatierung ist wie die in Pjordorfs Post. (hast du aber schon gemerkt ->3.Zeichen)
2. nochmals danke
3. ich glaube nein ;)
4. Ich werde es nach meinem Skiausflug nochmals testen.

Ich melde mich dann mit dem Ergebnis.

Schönes Wochenende euch allen.


P.S.: Wenn ich erst nach dem Namenskürzel die "-" ersetzten will, dann muss ich doch Zeile 13 abändern

z.B.: 13. set "Zeile= -%Zeile:~30%"
Member: bastla
bastla Feb 24, 2012 at 17:04:29 (UTC)
Goto Top
Hallo zeed78!
Wenn ich erst nach dem Namenskürzel die "-" ersetzten will ...
... ist das genau das, was der Batch schon macht - es wird ja in Zeile 13 die Zeile neu zusammengebaut nach dem Schema 2 Leerzeichen + "-" + Rest der Zeile (es wurden vorweg schon alle "-" in Leerzeichen umgewandelt, daher die 3 Leerzeichen am Anfang überspringen) ab Position 4 ...

Grüße
bastla
Member: zeed78
zeed78 Mar 05, 2012 at 14:20:01 (UTC)
Goto Top
Hallo,

das funktioniert soweit gut.
Es gibt nur noch ein Problem:

Wenn in einer Zeile z.B. "Vogel&Schworm" steht, dann spuckt er aus: "der Befehl Schworm konnte nicht gefunden werden".

Und das Schlimmste ist, er löscht die ganze Zeile.
Member: bastla
bastla Mar 05, 2012 at 15:14:12 (UTC)
Goto Top
Hallo zeed78!
Es gibt nur noch ein Problem:
... das sich vermutlich nur wird lösen lassen, wenn Du Deinen aktuellen Batch postest ...

Grüße
bastla
Member: zeed78
zeed78 Mar 06, 2012 at 09:28:32 (UTC)
Goto Top
Ich hatte einfach deinen Batch übernommen:
@echo off & setlocal
 set "Ein=fibujour"  
 set "Aus=%temp%\fibujour"  
 
 del "%Aus%" 2>nul  
 for /f "usebackq delims=" %%i in ("%Ein%") do set "Zeile=%%i" & call :ProcessLine  
 move "%Aus%" "%Ein%"  
 goto :eof
 
 :ProcessLine
 if "%Zeile:~2,1%" neq "-" goto :Ausgabe  
 set "Zeile=%Zeile:-= %"  
 set "Zeile=  -%Zeile:~3%"  
 
 :Ausgabe
 setlocal enabledelayedexpansion
 >>"%Aus%" echo %Zeile% & goto :eof  
 endlocal
 goto :eof 

cU all
zeed78
Member: bastla
bastla Mar 06, 2012 at 09:39:27 (UTC)
Goto Top
Hallo zeed78!
Ich hatte einfach deinen Batch übernommen:
Schwerer Fehler ... face-wink

Ändere die Zeile 17 auf
>>"%Aus%" echo !Zeile!
(was ich ursprünglich schon hätte tun sollen) ...

Grüße
bastla
Member: zeed78
zeed78 Mar 06, 2012 at 10:09:34 (UTC)
Goto Top
Prima,

vielen Dank. So sieht es klasse aus.
Member: zeed78
zeed78 Mar 19, 2012 at 09:00:41 (UTC)
Goto Top
So jetzt habe ich noch ein Problem:

Die gleiche Datei:

   56651 xxxxx             11712 09.01.12          265,85          316,36  
  -56651 xxxxx             11712 09.01.12         -265,85         -316,36  
   56653 xxxxx             13500 10.01.12          -45,00          -53,55

Allerdings muss ich jetzt immer, wenn vor den Beträgen ein Minus steht, auch noch vor die erste Zahl ein Minus setzten.
Kann ich den oberen Programmteil nehmen, und das Leerzeichen durch ein Minus ersetzten?

Das ist der erste Programmteil:

<code<@echo off & setlocal
set "Ein=fibujour"
set "Aus=%temp%\fibujour"

del "%Aus%" 2>nul
for /f "usebackq delims=" %%i in ("%Ein%") do set "Zeile=%%i" & call :ProcessLine
move "%Aus%" "%Ein%"
goto :eof

:ProcessLine
if "%Zeile:~2,1%" neq "-" goto :Ausgabe
set "Zeile=%Zeile:-= %"
set "Zeile= -%Zeile:~3%"

:Ausgabe
setlocal enabledelayedexpansion
"%Aus%" echo !Zeile! & goto :eof
endlocal
goto :eof

cU all

zeed78
Member: bastla
bastla Mar 19, 2012 at 09:47:57 (UTC)
Goto Top
Hallo zeed78!
immer, wenn vor den Beträgen ein Minus steht, auch noch vor die erste Zahl ein Minus setzten.
heißt, dass Deine 3. Zeile nachher so
 -56653 xxxxx             13500 10.01.12          -45,00          -53,55
aussehen soll (oder soll dann nur vor der ersten Zahl das Minus stehen)?

Grüße
bastla
Member: zeed78
zeed78 Mar 19, 2012 at 11:46:24 (UTC)
Goto Top
Hallo bastla,

genau so soll es aussehen.
Member: bastla
bastla Mar 19, 2012 at 12:01:59 (UTC)
Goto Top
Hallo zeed78!

Dann versuch es mit folgendem Verarbeitungsteil:
:ProcessLine
if "%Zeile:~2,1%" neq "-" (  
    echo "%Zeile%"|findstr "-">nul && set "Zeile=  -%Zeile:~3%"  
    goto :Ausgabe
)
set "Zeile=%Zeile:-= %"  
set "Zeile=  -%Zeile:~3%"  

:Ausgabe
setlocal enabledelayedexpansion
>>"%Aus%" echo !Zeile! & goto :eof  
endlocal
goto :eof
Grüße
bastla
Member: zeed78
zeed78 Mar 19, 2012 at 13:13:50 (UTC)
Goto Top
Hallo nochmal,

in jeder Zeile die er bearbeitet Syntaxfehler.
Member: bastla
bastla Mar 19, 2012 at 15:26:46 (UTC)
Goto Top
Hallo zeed78!

Inzwischen hatte ich etwas Zeit zum Testen:
:ProcessLine
if "%Zeile:~2,1%" neq "-" (  
    echo "%Zeile%"|findstr "\-" >nul && set "Zeile=  -%Zeile:~3%"  
    goto :Ausgabe
)
set "Zeile=%Zeile:-= %"  
set "Zeile=  -%Zeile:~3%"  

:Ausgabe
setlocal enabledelayedexpansion
>>"%Aus%" echo !Zeile!  
endlocal
goto :eof
Grüße
bastla
Member: zeed78
zeed78 Mar 20, 2012 at 13:57:47 (UTC)
Goto Top
Cool, es klappt,

aber der erste Programmteile sollte eigentlich wegfallen.
also

  -56651 xxxxx             11712 09.01.12         -265,85         -316,36  
soll so bleiben.
Member: bastla
bastla Mar 20, 2012 at 14:03:42 (UTC)
Goto Top
Hallo zeed78!

Dann lass doch einfach die Zeilen 6 und 7 weg ...

... bzw reduziere das Ganze auf:
:ProcessLine
if "%Zeile:~2,1%" neq "-" echo "%Zeile%"|findstr "\-" >nul && set "Zeile=  -%Zeile:~3%"  
setlocal enabledelayedexpansion
>>"%Aus%" echo !Zeile!  
endlocal
goto :eof
Grüße
bastla
Member: zeed78
zeed78 Mar 20, 2012 at 15:19:00 (UTC)
Goto Top
Haha,

cool. Eine Procesline und fertig.

Einen recht schönen Dank Bastla.
Es tut.