.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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 106935
Url: https://administrator.de/forum/txt-dateien-auf-duplikate-ueberpruefen-und-diese-loeschen-106935.html
Ausgedruckt am: 27.12.2024 um 09:12 Uhr
7 Kommentare
Neuester Kommentar
Hallo DaSilva!
Soferne es nicht stört, dass im Ergebnis keine Leerzeilen enthalten sein werden, müsste folgender Batch genügen:
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
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
Grüße
bastla
Hallo DaSilva!
Wie schon erwähnt werden Leerzeilen übersprungen, alle anderen Zeilen werden allerdings gezählt:
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
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
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