Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung Batch & Shell

Mitglied: 0belixx

0belixx (Level 1) - Jetzt verbinden

27.06.2011, aktualisiert 17:53 Uhr, 3622 Aufrufe, 11 Kommentare

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
Mitglied: mathe172
27.06.2011 um 19:56 Uhr
Hallo,

versuch mal folgendes als Alternative:
01.
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
Bitte warten ..
Mitglied: 0belixx
27.06.2011 um 20:35 Uhr
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
Bitte warten ..
Mitglied: bastla
27.06.2011 um 20:44 Uhr
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
01.
del Log.tmp 2>nul 
02.
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
Bitte warten ..
Mitglied: mathe172
27.06.2011 um 20:50 Uhr
Hallo,

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

Wobei m.M.n. deine Methode sehr langsam ist (mehrfaches öffnen der Datei für Schreibzugriff und anschliessendes Schliessen)
Wie wär's mit :
01.
rem -Geklaut/kopiert von bastla ;-) 
02.
>Log.txt.tmp (for /f "usebackq skip=29 delims=" %%A in ("C:\Temp\Log.txt") do echo.%%A)
Mathe172
Bitte warten ..
Mitglied: bastla
27.06.2011 um 20:57 Uhr
@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
Bitte warten ..
Mitglied: 0belixx
27.06.2011 um 21:05 Uhr
@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
Bitte warten ..
Mitglied: mathe172
27.06.2011 um 21:34 Uhr
Hallo,

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

Wie meinst du das?

Mathe172
Bitte warten ..
Mitglied: 0belixx
27.06.2011 um 21:53 Uhr
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
Bitte warten ..
Mitglied: mathe172
27.06.2011 um 22:17 Uhr
Hallo,

uups , 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
Bitte warten ..
Mitglied: 0belixx
27.06.2011 um 22:21 Uhr
Jetzt gehts.

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

01.
:: für eine zu sehende Befehlsausgabe mit Echo on 
02.
rem -Geklaut/kopiert von bastla ;-) 
03.
 
04.
4>Log.txt.tmp (for /f "usebackq skip=29 delims=" %%A in ("C:\Temp\Log.txt") do >&4 echo.%%A)
Gruß Phil
Bitte warten ..
Ähnliche Inhalte
Windows 7
gelöst TXT-Datei plötzlich 0 KByte groß (15)

Frage von SebastianJu zum Thema Windows 7 ...

PHP
gelöst TXT Datei auslesen und bestimmte Zeilen in Variable setzen (11)

Frage von 126594 zum Thema PHP ...

Batch & Shell
Maximale Größe zu verarbeitender txt-Dateien mit Batch (5)

Frage von Muck1303 zum Thema Batch & Shell ...

Neue Wissensbeiträge
Windows Tools

Zeit für Energiesparmodus, Bildschirmabschaltung etc. schnell anpassen

Anleitung von hannsgmaulwurf zum Thema Windows Tools ...

Linux Netzwerk

Ping und das einstellbare Bytepattern

(1)

Erfahrungsbericht von LordGurke zum Thema Linux Netzwerk ...

Windows Update

Microsoft Update KB4034664 verursacht Probleme mit Multimonitor-Systemen

(4)

Tipp von beidermachtvongreyscull zum Thema Windows Update ...

Heiß diskutierte Inhalte
Switche und Hubs
gelöst Cisco 2960x Stacking über mehrere Etagen (12)

Frage von b3scher zum Thema Switche und Hubs ...

Firewall
Richtige Grundeinstellungen der Pfsense für mein Netzwerk (12)

Frage von Spitzbube zum Thema Firewall ...