0belixx
Goto Top

Zeilen in sehr großer TXT Datei (100.000 Zeilen) löschen. Geht nur bis 75 Prozent.

Hallo Leute,

habe folgendes Problem:

Ich muss die ersten 30 Zeilen aus einer txt löschen, so weit so gut, habe das wie folgt gelöst:


FOR /F "delims=" %%i in ('dir /B C:\Log.txt') do (more +30 "%%i" > "%%i.tmp")

Das Problem ist das die tmp Datei zwar erstellt wird aber nicht vollständig.
Die tmp Datei ist wesendlich kleiner als die txt und am Ende steht:

-- Fortsetzung (75%) --

es gibt aber keine Fortsetzung. Die Zeilenanzahl ist zZ knapp 100.000 Zeilen, kann sich aber noch verdoppeln.

Kann mir jemand helfen was ich übersehen habe.

Danke
0belixx

Content-Key: 168707

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

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

Member: mathe172
mathe172 Jun 27, 2011 at 17:56:03 (UTC)
Goto Top
Hallo,

versuch mal folgendes als Alternative:
FOR /F "delims=" %%i in ('dir /B C:\Log.txt') do (> "%%i.tmp" (FOR /F "skip=29 usebackq delims=" %%A in ("%%i") do echo.%%A))  
Bei "skip=29" musst du die zu löschende Anzahl Zeilen-1 angeben (NICHT 0)

Mathe172
Member: 0belixx
0belixx Jun 27, 2011 at 18:35:12 (UTC)
Goto Top
Vielen Dank für die schnelle Idee. Hab das jetz so.

FOR /F "delims=" %%i in ('dir /B C:\Temp\Log.txt') do (> "%%i.tmp" (FOR /F "skip=29 usebackq delims=" %%A in ("%%i") do echo.%%A))

Die Datei läuft jetzt durch.

Nur gibt es jetzt jede Zeile 2x und vor der ersten der zwei wird noch ein "C:\Temp>echo." gesetzt.

0belixx
Member: bastla
bastla Jun 27, 2011 at 18:44:22 (UTC)
Goto Top
Hallo Obelixx und mathe172!

Die erste Schleife ist doch eigentlich sinnlos, da sie ja immer nur ein einzelnes "Log.txt" als %%i liefern kann ...

... daher sollte auch
del Log.tmp 2>nul
for /f "usebackq skip=29 delims=" %%A in ("C:\Temp\Log.txt") do >>Log.txt.tmp echo %%A  
genügen (wobei übrigens allfällige Leerzeilen auf der Strecke bleiben) ...

Übersichtlicher wird's natürlich noch, wenn für Pfad / Dateiname Variablen verwendet werden.

Grüße
bastla
Member: mathe172
mathe172 Jun 27, 2011 at 18:50:01 (UTC)
Goto Top
Hallo,

Die erste Schleife ist doch eigentlich sinnlos, da sie ja immer nur ein einzelnes "Log.txt" als %%i liefern kann ...
Wie peinlich... face-wink

Wobei m.M.n. deine Methode sehr langsam ist (mehrfaches öffnen der Datei für Schreibzugriff und anschliessendes Schliessen)
Wie wär's mit :
rem -Geklaut/kopiert von bastla ;-)
>Log.txt.tmp (for /f "usebackq skip=29 delims=" %%A in ("C:\Temp\Log.txt") do echo.%%A)  

Mathe172
Member: bastla
bastla Jun 27, 2011 at 18:57:35 (UTC)
Goto Top
@mathe172
Sollte natürlich so besser gehen - aber aufgrund der Fehlerbeschreibung wollte ich die Ausgabefunktion mal etwas variieren ...
Ganz nebenbei: Der Punkt nach Deinem "echo" schadet zwar nicht, ist aber gar nicht nötig, da für ein "leeres" %%A der "do"-Teil ohnehin nicht ausgeführt wird (weshalb ja auch keine Leerzeilen in die Ergebnisdatei mitgenommen werden).

Grüße
bastla
Member: 0belixx
0belixx Jun 27, 2011 at 19:05:30 (UTC)
Goto Top
@bastla

Danke funktioniert langsam aber da ich keine Eile habe mach ich das so danke.

@mathe172
bei deinem schnippsel wird immer noch eine 2te Zeile angelegt.

0belixx
Member: mathe172
mathe172 Jun 27, 2011 at 19:34:39 (UTC)
Goto Top
Hallo,

bei deinem schnippsel wird immer noch eine 2te Zeile angelegt.

Wie meinst du das?

Mathe172
Member: 0belixx
0belixx Jun 27, 2011 at 19:53:49 (UTC)
Goto Top
Wie ich oben schon geschrieben habe,
Die jeweilige Zeile der Quelldatei taucht 2x auf und vor der ersten der beiden Zeilen steht "C:\Temp>echo."

0belixx
Member: mathe172
mathe172 Jun 27, 2011 at 20:17:21 (UTC)
Goto Top
Hallo,

uups face-sad, da hab ich was vergessen:
Füge davor ein @echo off-Befehl ein (da die Gesamte Ausgabe der Schleife umgeleitet wird, stehen da immer zuerst noch die echo-Befehle)

MfG,
Mathe172
Member: 0belixx
0belixx Jun 27, 2011 at 20:21:23 (UTC)
Goto Top
Jetzt gehts.

danke an euch beide.
0belixx
Member: pieh-ejdsch
pieh-ejdsch Jun 28, 2011 at 06:56:13 (UTC)
Goto Top
moin Obelix,

wenn Du Batches mit angeschaltenem Echo (zum Debuggen) hast und nicht auf die Befehlsausgabe verzichten willst,
muss ein anderes Handle (Kanal für die Verarbeitung) als Handle 1 benutzt werden.

in Handle 1 (die CMD-gesamtausgabe) wird halt alles reingeschrieben.

Handle 3 ist noch auf der CMD-Line sichtbar wenn es nicht (weg-)umgeleitet wird.
Ab Handle 4 muss/sollte dann Explizit Umgeleitet werden.

:: für eine zu sehende Befehlsausgabe mit Echo on
rem -Geklaut/kopiert von bastla ;-)

4>Log.txt.tmp (for /f "usebackq skip=29 delims=" %%A in ("C:\Temp\Log.txt") do >&4 echo.%%A)  

Gruß Phil