afrodyte
Goto Top

Mehrere Leerzeichen per Batch löschen

Hallo, es gibt zwar eine ähnliche Anfrage, aber die hat mein Problem nicht beantwortet.

Ich möchte aus einer Exportdatei mehrere aufeinanderfolgende Leerzeichen löschen.
Wie müsste der Befehl dazu lauten?

Content-Key: 123362

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

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

Member: rubberman
rubberman Aug 24, 2009 at 14:11:23 (UTC)
Goto Top
Hallo afrodyte,

du könntest das evtl. so lösen:
@echo off &setlocal

set inFile=test1.txt
set outFile=test2.txt

type nul>"%outFile%"  
for /f "delims=: tokens=1*" %%i in ('findstr /n $ "%inFile%"') do set "Zeile=%%j" &call :loop  
goto :eof

:loop
if not defined Zeile (echo.>>"%outFile%") &goto:eof  
for /f "tokens=1*" %%a in ("%Zeile%") do set "wort=%%a" &set "Zeile=%%b"  
set "output=%output% %wort%"  
if not defined Zeile (goto ausgabe) else goto loop
:ausgabe
echo.%output:~1%>>"%outFile%"  
set "output="  
goto :eof

Grüße
rubberman
Member: afrodyte
afrodyte Aug 24, 2009 at 14:31:49 (UTC)
Goto Top
Hallo rubberman,

das haut leider nicht ganz hin, es bleiben von den 9 Leerzeichen weiterhin zwei stehen...

Noch eine Idee?

Trotzdem noch: vielen Dank für deine Rückmeldung.

Gruß
afrodyte
Member: bastla
bastla Aug 24, 2009 at 15:40:42 (UTC)
Goto Top
Hallo afrodyte!

Da rubbermans Lösung eigentlich nur je ein Leerzeichen belassen dürfte, wäre es sinnvoll, einige (anonymisierte) Zeilen aus der Exportdatei (unter Verwendung der ""-Formatierung) zu posten, um das Problem damit nachvollziehen zu können.

Außerdem: Wenn "mehrere aufeinanderfolgende Leerzeichen" gelöscht werden sollen und von 9 nur 2 übrig blieben, wäre die Anforderung eigentlich erfüllt face-wink - daher formuliere bitte etwas genauer, ob alle der mehreren Leerzeichen eliminiert oder doch auf nur eines reduziert werden bzw wie einzelne vorhandene Leerzeichen behandelt werden sollen ...
@rubberman
Eine Anmerkung zum "findstr": Wenn die letzte Zeile keine Zeilenschaltung enthält, wird sie durch den Suchbegriff "$" auf der Strecke bleiben - wenn Du alternativ "^" (mit Anführungszeichen geschrieben) verwendest, kann das nicht passieren.

Grüße
bastla
Member: rubberman
rubberman Aug 24, 2009 at 15:53:40 (UTC)
Goto Top
@afrodyte,
kann mich bastla nur anschließen. Im Test werden auch 9 aufeinanderfolgende Leerzeichen auf eines reduziert.

@bastla,
danke für den Tipp. Über genau dieses Problem hab ich schon ein paar mal nachgedacht, jetzt hab ich die Lösung (und das ganz ohne danach gefragt zu haben face-smile ).

Grüße
rubberman
Member: bastla
bastla Aug 24, 2009 at 16:12:14 (UTC)
Goto Top
@rubberman
jetzt hab ich die Lösung
Was meinst Du wohl, von wem die stammt ... face-wink
(und das ganz ohne danach gefragt zu haben face-wink )
Gelegentlich fehlt's mir an Zurückhaltung ... face-wink

Grüße
bastla
Member: afrodyte
afrodyte Aug 24, 2009 at 18:33:12 (UTC)
Goto Top
Hallo,
es sollen mehrere aufeinanderfolgende Leerzeichen entfernt werden. Und dnan natürlich alle, die dort stehen. Es dürfen jedoch keine einzelnen Leerzeichen entfernt werden, sondern nur dort wo mehrere nebeneinanderstehen, alle. Per Ersetzen funktioniert das einwandfrei und so brauche ich es auch im Script.
Eine Beispieldatei sende ich morgen.
Member: bastla
bastla Aug 24, 2009 at 19:11:47 (UTC)
Goto Top
Hallo afrodyte!

Mit native Batch lässt sich das zwar auch lösen, aber mit ein wenig eingebettetem VBScript ist es einfacher:
@echo off & setlocal
set "inFile=test1.txt"  
set "outFile=test2.txt"  

set R=%temp%\RemoveBlanks.vbs
>%R%  echo Set fso=CreateObject("Scripting.FileSystemObject")  
>>%R% echo T=fso.OpenTextFile(WScript.Arguments(0)).ReadAll
>>%R% echo Set rE=New RegExp:re.Pattern=" {2,}":re.Global=True  
>>%R% echo fso.CreateTextFile(WScript.Arguments(1),True).Write rE.Replace(T,"")  

cscript //nologo %R% "%inFile%" "%outFile%" 
Es kann bei Bedarf auch "in" der Datei ersetzt werden - dazu einfach für %outFile% die selbe Datei wie für %inFile% angeben.
Ganz ohne Umweg über einen Batch sähe das VBScript so aus
Set fso=CreateObject("Scripting.FileSystemObject")  
T=fso.OpenTextFile(WScript.Arguments(0)).ReadAll
Set rE=New RegExp
re.Pattern=" {2,}"  
re.Global=True
fso.CreateTextFile(WScript.Arguments(1),True).Write rE.Replace(T,"")  
und könnte mit
cscript //nologo "RemoveBlanks.vbs" "test1.txt" "test2.txt"
aufgerufen werden.

Grüße
bastla
Member: rubberman
rubberman Aug 24, 2009 at 19:49:47 (UTC)
Goto Top
@bastla,
gut dass wenigstens Du verstanden hast, wie das ganze gemeint war. Nachdem ich mir Dein VBScript angesehen habe, hab ich's auch kapiert. Hätte da zwar auch noch einen Batchgedanken in petto, aber Du hast recht, vbs ist sinnvoller (sicherer und zig mal schneller).

Ja, und dann war wohl noch das "Urheber-Danke" an Biber fällig face-wink
Member: afrodyte
afrodyte Aug 25, 2009 at 16:10:29 (UTC)
Goto Top
Hallo bastla,

vielen Dank für den weiteren Vorschlag.
Leider bleibt auch bei dieser Befehlskette ein Leerzeichen am Ende der Zeile stehen.
Wenn du (oder gern auch jemand anderes) noch einen Vorschlag dazu hast, wie ich ALLE Leerzeichen am Ende der Zeile loswerden kann, würde ich ihn gerne testen.

Beispieldaten:
1;10;Nachname;Vorname;01.01.1911 00:00:00;w;Sowieso Str. 1;Stadt;10111;01.02.1999 00:00:00;111111;211111         
1;12;Nachname;Vorname;01.01.1911 00:00:00;w;Sowieso Str. 1;Stadt;10111;01.02.1999 00:00:00;111111;211111         
1;14;Nachname;Vorname;01.01.1911 00:00:00;w;Sowieso Str. 1;Stadt;10111;01.02.1999 00:00:00;111111;211111         
1;16;Nachname;Vorname;01.01.1911 00:00:00;w;Sowieso Str. 1;Stadt;10111;01.02.1999 00:00:00;111111;211111         


Grüße
afrodyte
Member: bastla
bastla Aug 25, 2009 at 16:21:01 (UTC)
Goto Top
Hallo afrodyte!
Leider bleibt auch bei dieser Befehlskette ein Leerzeichen am Ende der Zeile stehen.
Dann war dort vermutich auch vorher bereits ein einzelnes solches ...

Anyhow, wenn Du
Write rE.Replace(T,"")
durch
Write RTrim(rE.Replace(T,""))
ersetzt, sollte auch dieses letzte Leerzeichen Geschichte sein.

Grüße
bastla