mamahuana
Goto Top

Leerzeichen am Anfang einer Zeiler einer Textdatei per Batch-Datei. Wie geht das?

Hallo zusammen,

als allererstes möchte ich ein Lob für dieses geniale Forum abgeben. Das ist heute mein erster Beitrag und ich hoffe das mir vielleicht jemand helfen kann.

Es geht um folgendes:

Ich habe eine Textdatei mit ca. 10000 Zeilen und möchte am Anfang jeder Zeile ein einfaches Leerzeichen setzen.

Wie kann ich das per Batchdatei lösen?

Wäre super, wenn mir da jemand helfen könnte.

Vielen Dank

Content-ID: 132534

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

Ausgedruckt am: 26.11.2024 um 04:11 Uhr

rubberman
rubberman 30.12.2009 um 19:21:18 Uhr
Goto Top
Hallo mamahuana,

eigentlich gar nicht so schwer. Grundsätzlich etwa so
@echo off &setlocal
set Quelle=abc.txt
set Ziel=xyz.txt

for /f "usebackq delims=" %%i in ("%Qelle") do >>"%Ziel%" echo  %%i  

ABER
So wie es jetzt ist werden Leerzeilen übergangen, <>|& und % im Text führen zu Fehlern.

Gib mal etwas mehr Info zum Inhalt der Datei.

Grüße
rubberman
Biber
Biber 30.12.2009 um 19:55:27 Uhr
Goto Top
Moin mamahuana,

willkommen im Forum.

Nicht, dass ich jemand den Spass am Skripten nehmen will, aber...

?? Ist es denn wirklich nötig, dieses führende Leerzeichen (mit Informationsgehalt Null) in eine Kopie der 10000-Zeilendatei zu schreiben??

Wenn es so stumpf wie geschildert einfach als jedes erstes Zeichen der Zeile auftauchen soll, dann kann doch ebensogut das "einlesende" Programm sich ein Leerzeichen dazudenken, oder?
Wie sieht denn dein eigentlicher Verarbeitungsprozess aus?

Grüße
Biber
bastla
bastla 30.12.2009 um 22:12:25 Uhr
Goto Top
Hallo mamhuana und auch von mir ein Willkommen!

Ohne Bibers edukative Bemühungen unterlaufen zu wollen (und tatsächlich nur aus Freude am Scripten face-wink):
@echo off & setlocal
set "Datei=D:\Test.txt"  

set "IB=%temp%\InsertBlank.vbs"  
> %IB% echo D=WScript.Arguments(0):Set fso=CreateObject("Scripting.FileSystemObject")  
>>%IB% echo T=fso.OpenTextFile(D).ReadAll:fso.CreateTextFile(D).Write " "^&Replace(T,vbCrLF,vbCrLf^&" ")  

cscript //nologo %IB% "%Datei%" 
Achtung: Es wird (ohne Erstellung einer Sicherungskopie) unmittelbar die Datei verändert!

Grüße
bastla
Biber
Biber 30.12.2009 um 23:15:57 Uhr
Goto Top
Moin bastla,

diese Idee (mit VbSkript, .ReadAll und Replace alle CRLFs durch CRLF+Space) direkt in der Originaldatei zu erstzen hatte ich auch.
Ich habe es allerdings sofort wieder verworfen, weil ich dachte, ich hätte
  • ein Leerzeichen zuwenig in der ersten Zeile
  • dafür nach dem letzten Zeilenende ein Leerzeichen zuviel und damit eine Zeile mehr (die nicht mit CRLF endet)

Wie gehst du mit diesen Detailproblemen um? face-wink

Außerdem... das sind doch keine edukativen Bemühungen.
Ich denke nur an die armen Bätche - die haben doch auch Gefühle und machen viel lieber etwas Sinnvolles als 10000 Zeilen um ein leading blank aufzublasen. face-wink

Grüße
Biber
rubberman
rubberman 30.12.2009 um 23:44:11 Uhr
Goto Top
Hallo Biber,

Zitat von @Biber:
Wie gehst du mit diesen Detailproblemen um? face-wink

Wie groß darf ein Array sein?

An bastlas Code anknüpfend.
arrLines = Split(fso.OpenTextFile(D).ReadAlll, vbCrLf)
Beim Schreiben vor jede Zeile ein Space zu setzen sollte dann nicht das Problem sein.

Allerdings hast du mit dem Sinn oder Unsinn dieser Aktion schon Recht face-wink

Grüße
rubberman
bastla
bastla 31.12.2009 um 11:55:21 Uhr
Goto Top
@Biber
  • Das Leerzeichen in der ersten Zeile wird (auch bisher schon) explizit hinzugefügt.
  • Wenn die Datei mit einem CRLF endet, enthält die Datei ja eigentlich schon eine zusätzliche Zeile (die bisher leer war) - falls diese aber tatsächlich kein Leerzeichen bekommen soll, bietet es sich an - da ein "Trim()" (oder gezielter: "RTrim()") nicht treffsicher genug ist (es könnten am Beginn der ersten bzw am Ende der letzten Zeile schon gewollte Leerzeichen existieren) - einfach den String um das (eine) von mir verbrochene letzte Zeichen gekürzt auszugeben:
> %IB% echo D=WScript.Arguments(0):Set fso=CreateObject("Scripting.FileSystemObject")  
>>%IB% echo T=Replace(fso.OpenTextFile(D).ReadAll,vbCrLF,vbCrLf^&" ")  
>>%IB% echo fso.CreateTextFile(D).Write " "^&Left(T,Len(T)-1)  
@rubberman
Natürlich auch ein Weg (und bei 10000 Zeilen sicherlich auch kein Problem mit der Größe) ...

Grüße
bastla

P.S.:
Ich denke nur an die armen Bätche
Ich doch auch, drum lass' ich die Drecksarbeit ja von einem VBScript (das dann auch noch schuld ist) machen ... face-devilish
rubberman
rubberman 31.12.2009 um 15:38:20 Uhr
Goto Top
Hallo bastla,

Zitat von @bastla:
  • Das Leerzeichen in der ersten Zeile wird (auch bisher schon) explizit hinzugefügt.

Das überrascht mich allerdings ein bisschen.

Zitat von @bastla:
...drum lass' ich die Drecksarbeit ja von einem VBScript (das dann auch noch schuld ist) machen

... und ich hab mich immer schon gefragt, wozu VBScripte eigentlich gut sind face-wink

Guten Rutsch in 2010 an alle, die es lesen.

Grüße
rubberman
bastla
bastla 31.12.2009 um 16:13:15 Uhr
Goto Top
Hallo rubberman!
Zitat von @bastla:
  • Das Leerzeichen in der ersten Zeile wird (auch bisher schon) explizit hinzugefügt.

Das überrascht mich allerdings ein bisschen.
Inwiefern (siehe Erstfassung)?
>>%IB% echo T=fso.OpenTextFile(D).ReadAll:fso.CreateTextFile(D).Write " "^&Replace(T,vbCrLF,vbCrLf^&" ")
                                                                       ^
Auch von mir alles Gute für 2010
bastla
rubberman
rubberman 31.12.2009 um 16:44:20 Uhr
Goto Top
Zitat von @bastla:
Inwiefern (siehe Erstfassung)?


Ich bin mit Blindheit geschlagen, hoffentlich bessert sich das im neuen Jahr. (Allerdings nur, wenn heute Abend nicht ausgerechnet Methyl-gepanschter Fusel drunter ist face-wink )

Grüße
rubberman
Biber
Biber 31.12.2009 um 19:57:16 Uhr
Goto Top
Moin bastla,

in der Tat, das Leerzeichen in der ersten Zeile habe ich einfach übersehen.
Liegt wahrscheinlich daran, dass deine Schnipsel immer so ausschweifend (manchmal über mehrere Zeilen!) lang sind.

Ich wünsche auch allen Mitlesenden alles Gute für 2010!

Grüße
Biber
pieh-ejdsch
pieh-ejdsch 06.03.2010 um 16:42:19 Uhr
Goto Top
moin @ all,

ist zwar schon eine Weile her, dass dieser Thread hier geöffnet wurde aber ich denke die Batchlösung für dieses Problem kann ja auch hier rein.
@echo off &setlocal
set Quelle=abc.txt
set Ziel=xyz.txt

for /f "tokens=*" %%i in ('findstr /n .* "%Quelle%"') do (set "Zeile=%%i"  
		setlocal enabledelayedexpansion
		set "Zeile=!Zeile:*:=!"  
		(for /f %%j in ("!Zeile!") do echo. !Zeile!>>"%Ziel%"&endlocal)||endlocal  
	)

sollte funktionieren ist aus der numberme ab Zeile 57

was sagt denn der Threadstarter ist der grüne Haken noch auffindbar oder brachte die bisherige Diskussion wenig Erfolg?

@rubberman bei dir fehlt das "u" in Quelle Zeile 05

Gruß Phil
pieh-ejdsch
pieh-ejdsch 06.03.2010 um 18:03:10 Uhr
Goto Top
ach das war ebend die Version ohne Die Leerzeilen mitzunehmen aber um diese mitzunehmen ist nur Zeile 08 leicht zu verändern.

Mit LeerZeilen

@echo off &setlocal
set Quelle=abc.txt
set Ziel=xyz.txt

for /f "tokens=*" %%i in ('findstr /n .* "%Quelle%"') do (set "Zeile=%%i"  
		setlocal enabledelayedexpansion
		set "Zeile=!Zeile:*:=!"  
		echo. !Zeile!>>"%Ziel%"&endlocal	  
	)

Gruß Phil
bastla
bastla 06.03.2010 um 18:24:27 Uhr
Goto Top
@ph

Eigentlich sollte doch auch
@echo off & setlocal
set Quelle=abc.txt
set Ziel=xyz.txt

del "%Ziel%" 2>nul  
for /f "tokens=1* delims=:" %%i in ('findstr /n .* "%Quelle%"') do >>"%Ziel%" echo. %%j  
genügen ...

(Und natürlich gilt weiterhin, was rubberman schon eingangs erwähnte: <>|& und % im Text führen zu Fehlern.)

Grüße
bastla