Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Suchen und ersetzten mit Bedingung

Frage Entwicklung Batch & Shell

Mitglied: zeed78

zeed78 (Level 1) - Jetzt verbinden

24.02.2012, aktualisiert 13:35 Uhr, 2089 Aufrufe, 20 Kommentare

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?
Mitglied: Pjordorf
24.02.2012 um 13:50 Uhr
Hallo,

Zitat von zeed78:
(Die Leerzeichen werden leider nicht angezeigt).
Dann setze diese doch in code tags mit type=plain. Hier nachzulesen http://www.administrator.de/index.php?faq=20#toc31.
   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
Bitte warten ..
Mitglied: bastla
24.02.2012 um 13:51 Uhr
Hallo zeed78 und willkommen im Forum!

Etwa so:
01.
@echo off & setlocal 
02.
set "Ein=D:\Datei1.txt" 
03.
set "Aus=D:\Datei2.txt" 
04.
 
05.
del "%Aus%" 2>nul 
06.
for /f "usebackq delims=" %%i in ("%Ein%") do set "Zeile=%%i" & call :ProcessLine 
07.
goto :eof 
08.
 
09.
:ProcessLine 
10.
if "%Zeile:~,1%" neq "-" (>>"%Aus%" echo %Zeile% & goto :eof) 
11.
set "Zeile=%Zeile:-= %" 
12.
>>"%Aus%" echo -%Zeile:~1% 
13.
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
Bitte warten ..
Mitglied: zeed78
24.02.2012 um 15:05 Uhr
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.
Bitte warten ..
Mitglied: bastla
24.02.2012 um 16:01 Uhr
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?

[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:
01.
@echo off & setlocal 
02.
set "Ein=fibujour" 
03.
set "Aus=%temp%\fibujour" 
04.
 
05.
del "%Aus%" 2>nul 
06.
for /f "usebackq delims=" %%i in ("%Ein%") do set "Zeile=%%i" & call :ProcessLine 
07.
move "%Aus%" "%Ein%" 
08.
goto :eof 
09.
 
10.
:ProcessLine 
11.
if "%Zeile:~2,1%" neq "-" goto :Ausgabe 
12.
set "Zeile=%Zeile:-= %" 
13.
set "Zeile=  -%Zeile:~3%" 
14.
 
15.
:Ausgabe 
16.
setlocal enabledelayedexpansion 
17.
>>"%Aus%" echo %Zeile% & goto :eof 
18.
endlocal 
19.
goto :eof
Leerzeilen werden so weiterhin nicht "mitgenommen" ...
[/Edit]

Grüße
bastla
Bitte warten ..
Mitglied: zeed78
24.02.2012 um 17:47 Uhr
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%"
Bitte warten ..
Mitglied: bastla
24.02.2012 um 18:04 Uhr
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
Bitte warten ..
Mitglied: zeed78
05.03.2012 um 15:20 Uhr
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.
Bitte warten ..
Mitglied: bastla
05.03.2012 um 16:14 Uhr
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
Bitte warten ..
Mitglied: zeed78
06.03.2012 um 10:28 Uhr
Ich hatte einfach deinen Batch übernommen:
01.
@echo off & setlocal 
02.
 set "Ein=fibujour" 
03.
 set "Aus=%temp%\fibujour" 
04.
  
05.
 del "%Aus%" 2>nul 
06.
 for /f "usebackq delims=" %%i in ("%Ein%") do set "Zeile=%%i" & call :ProcessLine 
07.
 move "%Aus%" "%Ein%" 
08.
 goto :eof 
09.
  
10.
 :ProcessLine 
11.
 if "%Zeile:~2,1%" neq "-" goto :Ausgabe 
12.
 set "Zeile=%Zeile:-= %" 
13.
 set "Zeile=  -%Zeile:~3%" 
14.
  
15.
 :Ausgabe 
16.
 setlocal enabledelayedexpansion 
17.
 >>"%Aus%" echo %Zeile% & goto :eof 
18.
 endlocal 
19.
 goto :eof 
cU all
zeed78
Bitte warten ..
Mitglied: bastla
06.03.2012 um 10:39 Uhr
Hallo zeed78!
Ich hatte einfach deinen Batch übernommen:
Schwerer Fehler ...

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

Grüße
bastla
Bitte warten ..
Mitglied: zeed78
06.03.2012 um 11:09 Uhr
Prima,

vielen Dank. So sieht es klasse aus.
Bitte warten ..
Mitglied: zeed78
19.03.2012 um 10:00 Uhr
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:

01.
nul 
02.
for /f "usebackq delims=" %%i in ("%Ein%") do set "Zeile=%%i" & call :ProcessLine 
03.
move "%Aus%" "%Ein%" 
04.
goto :eof 
05.
 
06.
:ProcessLine 
07.
if "%Zeile:~2,1%" neq "-" goto :Ausgabe 
08.
set "Zeile=%Zeile:-= %" 
09.
set "Zeile=  -%Zeile:~3%" 
10.
 
11.
:Ausgabe 
12.
setlocal enabledelayedexpansion 
13.
>>"%Aus%" echo !Zeile! & goto :eof 
14.
endlocal 
15.
goto :eof
cU all

zeed78
Bitte warten ..
Mitglied: bastla
19.03.2012 um 10:47 Uhr
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
Bitte warten ..
Mitglied: zeed78
19.03.2012 um 12:46 Uhr
Hallo bastla,

genau so soll es aussehen.
Bitte warten ..
Mitglied: bastla
19.03.2012 um 13:01 Uhr
Hallo zeed78!

Dann versuch es mit folgendem Verarbeitungsteil:
01.
:ProcessLine 
02.
if "%Zeile:~2,1%" neq "-" ( 
03.
    echo "%Zeile%"|findstr "-">nul && set "Zeile=  -%Zeile:~3%" 
04.
    goto :Ausgabe 
05.
06.
set "Zeile=%Zeile:-= %" 
07.
set "Zeile=  -%Zeile:~3%" 
08.
 
09.
:Ausgabe 
10.
setlocal enabledelayedexpansion 
11.
>>"%Aus%" echo !Zeile! & goto :eof 
12.
endlocal 
13.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: zeed78
19.03.2012 um 14:13 Uhr
Hallo nochmal,

in jeder Zeile die er bearbeitet Syntaxfehler.
Bitte warten ..
Mitglied: bastla
19.03.2012 um 16:26 Uhr
Hallo zeed78!

Inzwischen hatte ich etwas Zeit zum Testen:
01.
:ProcessLine 
02.
if "%Zeile:~2,1%" neq "-" ( 
03.
    echo "%Zeile%"|findstr "\-" >nul && set "Zeile=  -%Zeile:~3%" 
04.
    goto :Ausgabe 
05.
06.
set "Zeile=%Zeile:-= %" 
07.
set "Zeile=  -%Zeile:~3%" 
08.
 
09.
:Ausgabe 
10.
setlocal enabledelayedexpansion 
11.
>>"%Aus%" echo !Zeile! 
12.
endlocal 
13.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: zeed78
20.03.2012 um 14:57 Uhr
Cool, es klappt,

aber der erste Programmteile sollte eigentlich wegfallen.
also

  -56651 xxxxx             11712 09.01.12         -265,85         -316,36  
soll so bleiben.
Bitte warten ..
Mitglied: bastla
20.03.2012 um 15:03 Uhr
Hallo zeed78!

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

... bzw reduziere das Ganze auf:
01.
:ProcessLine 
02.
if "%Zeile:~2,1%" neq "-" echo "%Zeile%"|findstr "\-" >nul && set "Zeile=  -%Zeile:~3%" 
03.
setlocal enabledelayedexpansion 
04.
>>"%Aus%" echo !Zeile! 
05.
endlocal 
06.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: zeed78
20.03.2012 um 16:19 Uhr
Haha,

cool. Eine Procesline und fertig.

Einen recht schönen Dank Bastla.
Es tut.
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
Powershell - In Textdatei suchen und ersetzen (5)

Frage von Raaja89 zum Thema Batch & Shell ...

Batch & Shell
gelöst Suchen und Ersetzen mehrerer Suchbegriffe per Batch (4)

Frage von makroll10 zum Thema Batch & Shell ...

Linux
Chemnitzer Linux-Tage 2017 suchen nach Beiträgen

Link von runasservice zum Thema Linux ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (18)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...