nachtgefluester
Goto Top

Per Batch in Textdatei (1.000.000 Zeilen) Muster finden und löschen und etwas einfügen

Hallo.

Habe ein Doubletten-Suchprogramm auf meine Festplatten losgelassen. Solch ein Programm findet raus, ob eine Datei zweimal / dreimal / x-mal vorhanden ist.

Rausgekommen ist eine Textdatei mit etwas mehr als 1.000.000 Zeilen (Leerzeilen miteingerechnet). Aus dieser Textdatei müssten mehrere Textmuster erkannt und entfernt bzw. ersetzt werden.

Die Suchfunktion habe ich bereits eine halbe Stunde lang ergebnislos benutzt. Finde nichts, was sich aus bereits vorhandenen Lösungen zusammenbasteln lässt, um mein Problem zu lösen.


Aufbau der Textdatei (exemplarisch), Leerzeichen sind mit # dargestellt:

123456789##C:\Order0\Datei1.xyz##########DD.MM.YYYY##HH:MM
123456789##D:\Order1\Datei1.xyz##########DD.MM.YYYY##HH:MM
(Leerzeile)
##3456789##E:\Order2\Datei2.xyz#######DD.MM.YYYY##HH:MM
##3456789##F:\Order3\Datei2.xyz#######DD.MM.YYYY##HH:MM
##3456789##D:\Order4\Datei2.xyz#######DD.MM.YYYY##HH:MM
##3456789##C:\Order5\Datei2.xyz#######DD.MM.YYYY##HH:MM
(Leerzeile)
9##I:\Order#X\Datei#Z.xyz##############DD.MM.YYYY##HH:MM
9##J:\Order#Y\Datei#Z.xyz##############DD.MM.YYYY##HH:MM
9##B:\Order#A\Datei#Z.xyz##############DD.MM.YYYY##HH:MM
(Leerzeile)


Der Aufbau nochmal in Textform:

[1] Am Anfang also eine bis zu neunstellige Zahl. Wird diese kleiner, werden die entsehenden Lücken vor der Zahl, mit bis zu acht Leerzeichen aufgefüllt. Diese Zahl ist nicht fortlaufend (also nicht 1, 2, 3, 4, ...), sondern es sind auch Sprünge vorhanden

[2] Danach folgen immer zwei Leerzeichen

[3] Dann die Pfadangabe. Diese kann Leerzeichen enthalten

[4] Nach der Pfadangabe kommen unterschiedlich viele Leerzeichen

[5] Das Datum in der Form DD.MM.YYYY folgt diesen unterschiedlich vielen Leerzeichen

[6] Danach folgen immer zwei Leerzeichen

[7] Und am Ende die Uhrzeit in der Form HH:MM


Was gelöscht werden soll: [1] + [2], [4] bis [7]


Danach sollte sie also so aussehen, Leerzeichen sind mit # dargestellt:

C:\Order0\Datei1.xyz
D:\Order1\Datei1.xyz
(Leerzeile)
E:\Order2\Datei2.xyz
F:\Order3\Datei2.xyz
D:\Order4\Datei2.xyz
C:\Order5\Datei2.xyz
(Leerzeile)
I:\Order#X\Datei#Z.xyz
J:\Order#Y\Datei#Z.xyz
B:\Order#A\Datei#Z.xyz
(Leerzeile)


Nun soll etwas eingefügt werden.

Hier schreibe ich erstmal das Ergebnis hin, Leerzeichen sind mit # dargestellt:

REM#"C:\Order0\Datei1.xyz"
DEL#/F#"D:\Order1\Datei1.xyz"
(Leerzeile)
REM#"E:\Order2\Datei2.xyz"
DEL#/F#"F:\Order3\Datei2.xyz"
DEL#/F#"D:\Order4\Datei2.xyz"
DEL#/F#"C:\Order5\Datei2.xyz"
(Leerzeile)
REM#"I:\Order#X\Datei#Z.xyz"
DEL#/F#"J:\Order#Y\Datei#Z.xyz"
DEL#/F#"B:\Order#A\Datei#Z.xyz"
(Leerzeile)


Die erste Zeile eines Blocks, wo aufgelistet wird, inwiefern die Datei zweimal / dreimal / x-mal vorhanden ist, soll also durch ein REM ausgeklammert werden und die restlichen Zeilen erhalten bis zur Leerzeile ein DEL /F

Der Pfadname soll in Anführungszeichen gesetzt werden.


Ich hoffe doch dass diese Aufgabe irgendwie lösbar ist. Von mir aus auch in mehreren Schritten. Und vielen Dank für die Mühe, es bis hierher durchgelesen zu haben und dann auch schonmal Danke dafür, sollte sich jemand an eine Lösung wagen.

Gruß,
NachtGefluester


[Edit Biber 16.9.2007]
Nachtgefluester hat im letzten halben Jahr keine Rückmeldung gegeben
Und sich auch nicht mehr angemeldet: Mitglied seit: 14.03.2007, letzter Login: 21.03.2007
Nur aus Respekt vor bastlas Mühen und Lösung habe ich diesen Beitrag nicht in den Papierkorb verschoben.
Beitrag geschlossen.
Auf "gelöst" setze ich ihn nicht ohne Rückmeldung des Threadowners.
[/Edit]

Content-Key: 54015

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

Ausgedruckt am: 28.03.2024 um 13:03 Uhr

Mitglied: bastla
bastla 14.03.2007 um 08:07:12 Uhr
Goto Top
Hallo NachtGefluester und willkommen im Forum!

Vielleicht solltest Du zunächst einmal die Optionen des von Dir verwendeten Programmes näher ansehen - vielleicht kann es bereits selbst die gewünschten Batchdatei erstellen.

Wenn das nicht geht, gäbe es als eine Alternative zB CloneSpy. Damit lassen sich sehr gezielt die Löschvorgänge steuern (eben auch über Batch). Einziges Manko (der von mir zuletzt verwendeten Version) der Batchverarbeitung mit CloneSpy ist der Umgang mit Sonderzeichen (also auch Umlauten). Das lässt sich aber per (zweitem) Batch beheben, etwa
chcp 1252
type CloneSpyResult.bat > Loeschen.bat

Grüße
bastla
Mitglied: bastla
bastla 14.03.2007 um 09:33:15 Uhr
Goto Top
Hallo NachtGefluester!

Bei näherem Hinsehen könntest Du (entsprechend dem Format Deiner Liste) ohnehin bereits CloneSpy verwendet haben, aber wie auch immer:

Erstellung der Batchdatei aus CloneSpy heraus:
Du brauchst dazu nur "Action / Automatically delete (without confirmation)" und "On automatic deletion / Defer deletion to batch file" zu wählen. In den Options kannst Du noch im Register "Export" (bei "Batch file properties") festlegen, ob die Batch-Datei jedes Mal neu erstellt werden, immer in die gleiche Datei geschrieben oder an eine schon vorhandene Datei angehängt werde soll und auch den Löschbefehl bearbeiten (entspricht aber ohnehin schon Deiner Vorgabe).

Der Unterschied zur von Dir angestrebten Lösung ist nur, dass in der erzeugten Batch-Datei nur die zu löschenden Dateien aufscheinen - Du kannst aber im Register "Logging" auch "Logging Properties / Enable / Log retained files" auswählen, um eine entsprechende Liste zu erhalten.
Da Du nun aber schon Deine Liste hast, ein kleines VB-Script (speichern unter zB "C:\Scripts\MakeDelBatch.vbs"), um die von Dir gewünschte Batch-Datei zu erstellen:
'MakeDelBatch.vbs  
Const LenAnfang = 11
Const LenEnde = 18
QuellDatei = ""  
If WScript.Arguments.Count < 1 Then
	QuellDatei = InputBox("Bitte die Quelldatei (mit vollem Pfad) angeben!")  
Else
	QuellDatei = WScript.Arguments(0)
End If

Set fso = Wscript.CreateObject("Scripting.FileSystemObject")  
If Not fso.FileExists(QuellDatei) Then
	WScript.Echo "Datei " & QuellDatei & " nicht gefunden."  
    WScript.Quit(1)
End If

Set Quelle = fso.OpenTextFile(QuellDatei, 1)

If InstrRev(QuellDatei, "\") Then  
	ZielDatei = Left(QuellDatei, InstrRev(QuellDatei, "\")) & _  
		"Loesche-" & Mid(QuellDatei, InstrRev(QuellDatei, "\") + 1)  
Else
	ZielDatei = "Loesche-" & QuellDatei  
End If
Set Ziel = fso.OpenTextFile(ZielDatei, 2, True)

Keep = True
Do While Not Quelle.AtEndOfStream
    Zeile = Quelle.ReadLine
	If Trim(Zeile) <> "" Then 'keine Leerzeile  
		P = Trim(Mid(Zeile, LenAnfang, Len(Zeile) - LenAnfang - LenEnde ))
		If Keep Then
			Ziel.WriteLine "REM " & Chr(34) & P & Chr(34)  
		Else
			Ziel.WriteLine "DEL /F " & Chr(34) & P & Chr(34)			  
		End If
		Keep = False
	Else 'Leerzeile  
		Ziel.WriteLine
		Keep = True 'nächste Datei behalten  
	End If
Loop
Quelle.Close
Ziel.Close
WScript.Echo "Fertig."  
Das Script kannst Du so verwenden, dass Du Deine Textdatei auf die Script-Datei ziehst oder es von der Commandline mit
C:\Scripts\MakeDelBatch.vbs "D:\Meine Duplikate.txt"  
startest. Erzeugt würde in diesem Fall die Datei "D:\Loesche-Meine Duplikate.txt".

Das oben angemerkte Umlaut-Problem wirst Du vermutlich aber auch bei dieser Variante erst noch lösen müssen.

Grüße
bastla