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-ID: 168707

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

Ausgedruckt am: 22.11.2024 um 16:11 Uhr

mathe172
mathe172 27.06.2011 um 19:56:03 Uhr
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
0belixx
0belixx 27.06.2011 um 20:35:12 Uhr
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
bastla
bastla 27.06.2011 um 20:44:22 Uhr
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
mathe172
mathe172 27.06.2011 um 20:50:01 Uhr
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
bastla
bastla 27.06.2011 um 20:57:35 Uhr
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
0belixx
0belixx 27.06.2011 um 21:05:30 Uhr
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
mathe172
mathe172 27.06.2011 um 21:34:39 Uhr
Goto Top
Hallo,

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

Wie meinst du das?

Mathe172
0belixx
0belixx 27.06.2011 um 21:53:49 Uhr
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
mathe172
mathe172 27.06.2011 um 22:17:21 Uhr
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
0belixx
0belixx 27.06.2011 um 22:21:23 Uhr
Goto Top
Jetzt gehts.

danke an euch beide.
0belixx
pieh-ejdsch
pieh-ejdsch 28.06.2011 um 08:56:13 Uhr
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