mannekl
Goto Top

Leerzeile aus txt-Datei löschen

Leerzeile löschen

Hallo,
mit welchen Patch-Befehl kann ich aus mehreren .txt-Dateien immer die dritte Zeile (Leerzeile)rauslöschen?Oder kann ich es mit einen CMD-Befehl z.Bsp:
for /f %i in ('dir /b *.txt') do findstr /b /v "" %i
Komme leider zu keinen brauchbaren Ergebnis.

Danke
MK

Content-ID: 33101

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

Ausgedruckt am: 26.11.2024 um 08:11 Uhr

Schirrmeister
Schirrmeister 23.05.2006 um 15:07:39 Uhr
Goto Top
Du kannst erst die ersten beiden Zeilen in eine andere Datei schreiben, und dann mit

for /F "skip=3 delims=" %%I in ( datei.txt ) do ( echo %%I>>datei_neu.txt )

den Rest ab der 4. Zeile...
Das delims= löscht die Trennzeichen, damit sollte die ganze Zeile in der Variable stehen.
gogoflash
gogoflash 23.05.2006 um 15:19:01 Uhr
Goto Top
Hi,


wenn alle Leerzeilen entfernt werden sollen.

for /f %%i in ('dir /b *.txt') do findstr . %%i >> neu%%i

Gruß Miguel
ManneKL
ManneKL 23.05.2006 um 15:27:50 Uhr
Goto Top
Hi Schirrmeister,
bringt Fehler:"%%I" ist syntaktisch an dieser Stelle nicht verarbeitbar.
bei
for /F "skip=4 delims=" %%I in ( *.txt ) do ( echo %%I>>*_neu.txt )

Habe mehrere txt-Dateien ,
Sorry, betrifft in diesen Dateien die vierte Zeile(Leerzeile).

Danke
MK
gogoflash
gogoflash 23.05.2006 um 15:33:11 Uhr
Goto Top
Hi,


Das Problem mit dieser FOR Schleife ist, dass sie bei einem Auftauchen einer zweiten Leeren Zeile strandet. Da %%i nicht definiert ist und die Schleife nicht initalisiert wird.

Meine Frage ist muss den nur die 4te Leerzeile entfernt werden oder können es alle sein.


Ist zwar nett gemeint, aber bricht sich das Genick.

Gruß Miguel
ManneKL
ManneKL 23.05.2006 um 15:38:46 Uhr
Goto Top
Hi Miguel,

ja nur die vierte Zeile aus jeder txt-Datei.
Gruß
MK
gogoflash
gogoflash 23.05.2006 um 15:54:36 Uhr
Goto Top
Hi,

hiermit sollte es gehen.

REM Erstmal Dateien einlesen
REM Aufrufen der Subroutine Sub und übergabe des Dateinamens.
for /f %%a in ('dir /b *.txt') DO call :sub %%a  

REM goto End Of File, wenn FOR Schleife durchgelaufen ist
goto :eof

:sub

REM Bis einschließlich Zeile 3 ausgeben. Zeilenzahl wird aus findstr gefischt.
REM findstr /N gibt 1:tertert aus.
REM Deshalb : als Token

for /F "delims=: tokens=1,2" %%a in ('findstr /N . %1') do IF %%a LEQ 3 echo %%b >> neu%1  

REM Jetzt geben wir den Rest aus mit more. Ab der 4ten Zeile
REM also erst die 5 usw wird ausgegeben.
more +4 %1 >> neu%1

Zu deinem Code:
Der erinnert mich an meinen Anfang mit Batch. Da hast Du einiges durcheinander gebracht.


for /F "skip=4 delims=" %%I in ( *.txt ) do ( echo %%I>>*_neu.txt )

1) *.txt ist nicht verarbeitbar für die Schleife, da *.txt kein Befehl ist.
deshalb dir /b *.txt
2) dir /b *.txt liefert Dir einen Dateinamen. Da ist es noch essig mit Schneiden, da könnest Du höchstens etwas aus dem Dateinamen ausschneiden. Für andere Zwecke brauchbar.
Deshalb Übergabe des Dateinamens an die 2 FOR Schleife
3) Mit Findstr und der Prüfung der Zeilenzahl wird das unsaubere Herausspringen aus der FOR Schleife verhindert, wenn es auf eine Leerzeile trifft.
for /f %%a in ('....') DO kann bei einer Leerzeile die Variable %%a nicht setzen.
4) Der Rest mit more sollte klar sein.
5) Delims wird nicht gebraucht, da Du die gesamte Zeile haben willst.Ausser für die Zeilennummer.


Übrigens mein Code kann bestimmt von einem Profibatcher noch weiter eingedampft werden.Und es gibt Tools die die Zeile ohne Probleme löschen können. Zb sed .
Aber das führt jetzt zuweit.

Gutes batch Tutorial unter:


Gruß Miguel
ManneKL
ManneKL 24.05.2006 um 06:25:50 Uhr
Goto Top
Hi Miguel,

vielen herzlichen Dank für Deine Lösung.
Sie funktioniert und ich kann sie noch weiter ausbauen.

Also, Danke
MK
ManneKL
ManneKL 24.05.2006 um 06:25:56 Uhr
Goto Top
ManneKL
ManneKL 24.05.2006 um 06:26:00 Uhr
Goto Top
ManneKL
ManneKL 24.05.2006 um 07:01:37 Uhr
Goto Top
Hi Miguel,

noch eine nachfolgende Frage:
Wie kann ich aus den neu entstandenen txt-Dateien anschließend wieder die Ursprungs-Bezeichnung (XXXXXXXX.txt)dieser txt-Dateien erzeugen?Weil nach Ablauf der Prozedur immer vor den Dateien die Bezeichnung "neuXXXXXXXX.txt" gesetzt wird.
Zum Schluß will ich diese txt-Dateien auch noch in einen neuen Ordner kopieren und in dem Ursprungsodner sollen alle Dateien als Kopie erhalten bleiben die ich später löschen will.
Vielleich kannst Du mir noch mal helfen

Danke
MK
gogoflash
gogoflash 24.05.2006 um 10:12:26 Uhr
Goto Top
Hi,


eine Version ohne Zwischendatei. Die korrogierte Datei wird sofort in einen neuen Ordner erstellt.
REM Hier geändert
set quellpfad=d:\a\1
set zielpfad=d:\a\2

REM Erstmal Dateien einlesen
REM Aufrufen der Subroutine Sub und übergabe des Dateinamens.
for /f %%a in ('dir /b %quellpfad%\*.txt') DO call :sub %%a  

REM goto End Of File, wenn FOR Schleife durchgelaufen ist
goto :eof

:sub
echo %1 >> ert.txt

REM Bis einschließlich Zeile 3 ausgeben. Zeilenzahl wird aus findstr gefischt.
REM findstr /N gibt 1:tertert aus.
REM Deshalb : als Token

REM Ausgabe in den neuen Pfad mit alten Namen
for /F "delims=: tokens=1,2" %%a in ('findstr /N . %quellpfad%\%1') do IF %%a LEQ 3 echo %%b >> %zielpfad%\%~nx1  

REM Jetzt geben wir den Rest aus mit more. Ab der 4ten Zeile
REM also erst die 5 usw wird ausgegeben.

REM Aus Quellpfad in den Zielpfad auslesen. Von +4
more +4 %quellpfad%\%1 >> %zielpfad%\%1

Gruß Miguel