dasilva
Goto Top

.txt Dateien auf Duplikate überprüfen und diese löschen

Ich möchte mehrere Textdateien zu einer großen zusammenfügen und diese Datei dann auf Duplikate überprüfen.
Das Zusammenfügen klappt gut, das Überprüfen auf Duplikate nicht so.
Mit UltraEdit kann man zwar gut Duplikate löschen lassen, allerdings nicht nur aufgrund der ersten Spalten.
Beispiel:

Eintrag1 blub
Eintrag1
Eintrag1

Ergebnis:


Eintrag1 blub
Eintrag1

Es soll aber so aussehen:

Eintrag1

Es sollen also nur die Zeichen bis Spalte x überprüft werden und davon dann alle Duplikate gelöscht werden.
Hat jemand eine Idee wie das geht?
Danke.

Content-Key: 106935

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

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

Member: NetWolf
NetWolf Jan 23, 2009 at 12:00:00 (UTC)
Goto Top
Hallo,

wenn man wüste, warum das so gemacht werden soll, würde ich empfehlen, vorher den Inhalt der Dateien auf Dubletten zu prüfen.


Grüße aus Schönberg (Lübeck)
Wolfgang
(Netwolf)
Member: DaSilva
DaSilva Jan 23, 2009 at 12:18:49 (UTC)
Goto Top
Jede einzelne Datei hat als Inhalt nur einzigartige Einträge.
Es handelt sich um regelmäßige Reports und da werden beim nächsten Report noch sehr viele Einträge vom vorherigen übernommen, da nicht geändert im Status.
Ich brauche jetzt eine Zusammenfassung aller bisherigen Reports in einer Datei ohne Duplikate und dabei sind mir nur die Einträge bis Spalte 20 wichtig.
Deswegen kann ich an der Ausgangssituation leider nichts ändern...
Member: NetWolf
NetWolf Jan 23, 2009 at 13:30:34 (UTC)
Goto Top
ich würde die Dateien in eine Datenbank (z.B. Access oder Base) einlesen, auswerten, fertig


Grüße aus Schönberg (Lübeck)
Wolfgang
(Netwolf)
Member: bastla
bastla Jan 23, 2009 at 15:29:24 (UTC)
Goto Top
Hallo DaSilva!

Soferne es nicht stört, dass im Ergebnis keine Leerzeilen enthalten sein werden, müsste folgender Batch genügen:
@echo off & setlocal
set "Datei=D:\Report.txt"  
set "Bak=.bak"  

move "%Datei%" "%Datei%%Bak%"  
copy nul "%Datei%">nul  
for /f "usebackq delims=" %%i in ("%Datei%%Bak%") do set "Zeile=%%i" & call :ProcessLine  
del "%Datei%%Bak%"  
goto :eof

:ProcessLine
findstr /b /c:"%Zeile:~,20%" "%Datei%">nul || >>"%Datei%" echo %Zeile%  
goto :eof 
Falls Du die Originalversion als Sicherung behalten möchtest (wird dann beim nächsten Batchlauf durch die dann aktuelle Datei überschrieben), die Zeile 8 durch das Voranstellen von "::" auskommentieren ...

Grüße
bastla
Member: DaSilva
DaSilva Jan 23, 2009 at 15:54:58 (UTC)
Goto Top
Danke, scheint zu funktionieren. Leerzeichen bleiben auch drin.
Braucht zum Ende hin (von der Dateigröße her gesehen) ziemlich lange.
Kann man noch einen Status (etwa "processing line 342...") einbauen?
Member: bastla
bastla Jan 23, 2009 at 16:07:43 (UTC)
Goto Top
Hallo DaSilva!

Wie schon erwähnt werden Leerzeilen übersprungen, alle anderen Zeilen werden allerdings gezählt:
@echo off & setlocal
set "Datei=D:\Report.txt"  
set "Bak=.bak"  
set /a LineNo=0

move "%Datei%" "%Datei%%Bak%"  
copy nul "%Datei%">nul  
for /f "usebackq delims=" %%i in ("%Datei%%Bak%") do set "Zeile=%%i" & call :ProcessLine  
del "%Datei%%Bak%"  
goto :eof

:ProcessLine
set /a LineNo+=1
echo processing Line %LineNo%
findstr /b /c:"%Zeile:~,20%" "%Datei%">nul || >>"%Datei%" echo %Zeile%  
goto :eof 
Dass es gegen Ende zäh wird liegt einfach daran, dass jede Zeile, bevor sie in die Ergebnisdatei geschrieben wird, zunächst in dieser Datei gesucht wird - wird sie nicht gefunden (was aber erst feststeht, wenn die gesamte Datei durchsucht wurde), kann sie geschrieben werden ...

Wären die Zeilen sortiert, müsste jede gelesene Zeile immer nur mit der letzten geschriebenen Zeile verglichen werden, was eine kürzere Laufzeit ermöglichen sollte, aber hier wohl nicht möglich sein dürfte ...

Grüße
bastla
Member: DaSilva
DaSilva Jan 23, 2009 at 22:05:26 (UTC)
Goto Top
Super, danke face-smile

Wie soll ich bloß die restlichen Zeichen füllen?
Ah, geschafft ;)