chrism73
Goto Top

Doppelte Datensätze aus einer txt-Datei löschen

Hallo ich habe das Problem das ich eine sehr lange Textdatei,mit Datensätzen habe und diese darf keine Leerzeilen oder doppelte oder gar 3 oder 4 fach die gleichen Datensätze enthält.
Die Datei sieht ungefähr so aus:

0114008,V00016317,0811422,1,20081205,000186CC.000,888,1,269,01,861,10,850,10
0114008,V00016317,0811422,1,20081205,000186CD.000,888,1,269,01,861,10,850,10
0114008,V00691087,0713420,1,20081205,00013292.000,888,1,090,01,278,01,269,01,240,01,861,10,850,10
0114008,V00691087,0713420,1,20081205,000132CE.000,888,1,090,01,278,01,269,01,240,01,861,10,850,10
0114008,V00691087,0713420,1,20081205,00013520.000,888,1,090,01,278,01,269,01,240,01,861,10,850,10
0114008,V00691087,0713420,1,20081205,0001367E.000,888,1,090,01,278,01,269,01,240,01,861,10,850,10
0114008,V02569433,0576220,1,20081205,00018991.000,888,1,090,01,278,01,269,01,240,01,861,10,850,10
0114008,V02569433,0576220,1,20081205,00018992.000,888,1,090,01,278,01,269,01,240,01,861,10,850,10

0114008,V02770806,0516610,1,20081205,00019440.000,888,1,090,01,278,01,240,01
0114008,V02770806,0516610,1,20081205,0001944D.000,888,1,090,01,278,01,269,01
0114008,V03885491,0516610,1,20081205,00019443.000,888,1,090,01,278,01,269,01
0114008,V03885491,0516610,1,20081205,0001944F.000,888,1,090,01,278,01,269,01
0114008,V04212450,0516610,1,20081205,00019442.000,888,1,090,01,278,01,269,01
0114008,V04212450,0516610,1,20081205,0001944E.000,888,1,090,01,278,01,269,01

und sollte danach so aussehen:

0114008,V00016317,0811422,1,20081205,000186CC.000,888,1,269,01,861,10,850,10
0114008,V00691087,0713420,1,20081205,00013292.000,888,1,090,01,278,01,269,01,240,01,861,10,850,10
0114008,V02569433,0576220,1,20081205,00018991.000,888,1,090,01,278,01,269,01,240,01,861,10,850,10
0114008,V02770806,0516610,1,20081205,00019440.000,888,1,090,01,278,01,240,01
0114008,V03885491,0516610,1,20081205,0001944F.000,888,1,090,01,278,01,269,01
0114008,V04212450,0516610,1,20081205,00019442.000,888,1,090,01,278,01,269,01

wichtig ist eigentlich nur falls die ersten beiden Zahlen gleich sind das dann einer von beiden Sätzen gelöscht wird.

wie kann ich das am besten automatisiert machen?

Content-ID: 103562

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

Ausgedruckt am: 22.11.2024 um 21:11 Uhr

bastla
bastla 08.12.2008 um 19:16:17 Uhr
Goto Top
Hallo ChrisM73!

Falls Dich das Verschwinden von Leerzeilen sowie die Tatsache, dass das Ergebnis sortiert ist, nicht stören sollten, etwa so:
@echo off & setlocal
set "Datei=D:\Ausgangsdatei.txt"  
set "Bak=.bak"  

sort "%Datei%" /o "%Datei%%Bak%"  
del "%Datei%"  
set Zuletzt=","  
for /f "usebackq tokens=1,2* delims=," %%i in ("%Datei%%Bak%") do set "Zeile=%%i,%%j,%%k" & call :ProcessLine "%%i%%j"  
goto :eof

:ProcessLine
if %1==%Zuletzt% goto :eof
set Zuletzt=%1
>>"%Datei%" echo %Zeile%  
goto :eof
Die Daten aus der ursprünglichen Datei stehen (sortiert, Leerzeilen am Anfang der Datei) als "Originaldatei.bak" weiterhin zur Verfügung (falls ein echtes Backup benötigt wird, einfach vorweg noch ein "copy" einbauen), die Ausgangsdatei wird durch die neue Fassung (ohne Duplikate) ersetzt.

Grüße
bastla

[Edit] Leerzeichen nach "/o" ergänzt. [/Edit]
ChrisM73
ChrisM73 09.12.2008 um 10:43:39 Uhr
Goto Top
Hallo Bastla,
vielen Dank für deine Hilfe, allerdings bringt er mir nen Fehler, habs im Dos-Fenster ausgeführt,bei sort "P:\Ausgangsdatei.txt" /o"P:\Ausgangsdatei.txt.bak" bringt er den Fehler ungültige Funktion. Was ist daran falsch?
bastla
bastla 09.12.2008 um 11:15:21 Uhr
Goto Top
Hallo ChrisM73!

Ein Leerzeichen nach dem "/o" sollte das Problem beheben (ich habe das oben auch nachgetragen).

Grüße
bastla
ChrisM73
ChrisM73 09.12.2008 um 11:23:09 Uhr
Goto Top
Hallo Bastla,
super jetzt läuft es!!! Allerdings habe ich noch was übersehen. Wenn die ersten 2 Zahlen einer Zeile bei 2 Zeilen gleich sind soll er auch eine Zeile von den beiden löschen.
Wie kann man das noch implementieren?

also wenn der Datensatz folgende Zeilen enthalten würde:

0021145,V07658465,01,544,01,584,01,582
0021145,V07658465,01,544,01,584

dann sollte nur noch dieser übrigbleiben:

0021145,V07658465,01,544,01,584,01,582
bastla
bastla 10.12.2008 um 11:06:35 Uhr
Goto Top
Hallo ChrisM73!
Wenn die ersten 2 Zahlen einer Zeile bei 2 Zeilen gleich sind soll er auch eine Zeile von den beiden löschen.
Wie kann man das noch implementieren?
Eigentlich sollte das bereits so funktionieren ...

Du könntest die Zeile 12 ändern auf
if /i %1==%Zuletzt% goto :eof
Da in den "Zahlen" offensichtlich auch Buchstaben enthalten sein können, sorgt das "/i" dafür, dass Groß-/Kleinschreibung nicht unterschieden wird (auch, wenn das kein Problem sein sollte, schadet's nicht).

Grüße
bastla
ChrisM73
ChrisM73 10.12.2008 um 11:20:37 Uhr
Goto Top
Super, das wars, vielen Dank hast mir sehr viel händische Arbeit erspart...