kugelschreiber15
Goto Top

Doppelte Einträge mit Batch entfernen

Hallo Leute,


bin grad dabei ein kleines Tool zu basteln und habe nun eine Frage!

Ich suche mit Hilfe von "find" nach einem Code (z.B. KUL1457) in einer CSV Datei.
Die Ausgabe schreibe ich in test.txt rein.

Die TXT Datei sieht dann so aus:
Hilfe; 125478454; ID15478455; 19.01.1956; 08:12:59; KUL1457

Mit Hilfe einer FOR Schleife suche ich mir nur ID15478455, 19.01.1956 und 08:12:59 heraus und gebe es aus.
Die FOR Schleife sieht so aus:

for /f "tokens=3-5 delims=; " %%i in (%tmp%\test.txt) do echo %i %%j %k

Nun kann es aber sein, dass in der Text Datei Einträge mit der gleichen ID vorhanden sind.
Beispiel TXT:
Hilfe; 125478454; ID15478455; 19.01.1976; 08:12:59; KUL1457
Hilfe; 125478455; ID15478455; 19.01.1999; 08:19:34; KUL1457
Hilfe; 125478456; ID15478455; 19.01.2012; 12:45:29; KUL1457


Wie kann ich es hinkriegen, dass Einträge mit der doppelten ID entfernt werden und nicht ausgegeben werden?
Dabei soll der erste Eintrag erhalten bleiben und auch ausgegeben werden.

Danke und Gruß
Kugelschreiber15

Content-Key: 265635

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

Printed on: April 24, 2024 at 14:04 o'clock

Mitglied: 114757
114757 Mar 08, 2015 updated at 17:52:55 (UTC)
Goto Top
Moin,
wenn es nur darum geht die Einträge nach dem ersten zu überspringen, einfach aus der Schleife springen:
for /f "tokens=3-5 delims=; " %%i in (%tmp%\test.txt) do echo %%i %%j %%k & goto :jump  
:jump
rem hier gehts weiter
Gruß jodel32
Member: bastla
bastla Mar 08, 2015 updated at 17:50:31 (UTC)
Goto Top
Hallo Kugelschreiber15 und willkommen im Forum!

Schematisch könnte das etwa so gehen (wenn Du weiterhin auch die "test.txt" erzeugten möchtest):
@echo off & setlocal
set "Ein=%temp%\test.txt"  
set "Aus=D:\Ohne_Duplikate.txt"  

copy nul "%Aus%" >nul  
for /f "usebackq delims=" %%i in ("%Ein%") do (  
    for /f "tokens=3-5 delims=; " %%a in ("%%i") do findstr "%%a" "%Aus%">nul || >>"%Aus%" echo %%i  
)
Ohne den Umweg über die "test.txt" könnte das so aussehen:
@echo off & setlocal
set "Suche=KUL1457"  
set "Ein=D:\Deine Datei.txt"  
set "Aus=D:\Ohne_Duplikate.txt"  

copy nul "%Aus%" >nul  
for /f "usebackq delims=" %%i in ('findstr "%Suche%" "%Ein%"') do (  
    for /f "tokens=3-5 delims=; " %%a in ("%%i") do findstr "%%a" "%Aus%">nul || >>"%Aus%" echo %%i  
)
- beide Varianten sind ungetestet ...

[Edit] Nachtrag: Nur die erste Zeile der "test.txt" könntest Du mit
set /p Zeile=<"%temp%\test.txt"
in eine Variable einlesen und diese dann weiter verarbeiten.
[/Edit]

Grüße
bastla
Member: Kugelschreiber15
Kugelschreiber15 Mar 08, 2015 at 20:04:22 (UTC)
Goto Top
Hallo,

vielen Dank für Eure Antworten.
Das hat super funktioniert!!!

Gruß
Kugelschreiber15
Mitglied: 114757
114757 Mar 08, 2015 at 22:34:25 (UTC)
Goto Top
face-smile
Den Beitrag dann bitte noch als gelöst markieren.
Member: Kugelschreiber15
Kugelschreiber15 Mar 10, 2015 at 17:30:30 (UTC)
Goto Top
Hallo,

ein Problem habe ich noch face-sad

Ich habe folgenden Code:

copy nul "%tmp%\TestDatei1_ohneDUP.txt" >nul   
for /f "usebackq delims=" %%i in ("%tmp%\TestDatei2.txt") do (   
    for /f "tokens=3 delims=; " %%a in ("%%i") do findstr "%%a" "%tmp%\TestDatei1_ohneDUP.txt">nul || >>"%tmp%\TestDatei1_ohneDUP.txt" echo %%i   

)

und folgenden:

copy nul "%tmp%\TestDatei2_ohneDUP.txt" >nul   
for /f "usebackq delims=" %%i in ("%tmp%\TestDatei2.txt") do (   
    for /f "tokens=3 delims=; " %%a in ("%%i") do findstr "%%a" "%tmp%\TestDatei2_ohneDUP.txt">nul || >>"%tmp%\TestDatei2_ohneDUP.txt" echo %%i   

)

Beides ist eigentlich gleich, nur die TXT Dateien sind unterschiedlich.
Bekomme beim ersten Errorlevel 0, beim zweiten aber Errorlevel 1

Woran kann das liegen? Evtl. daran, dass beides sich in einer Datei befindet?

Danke.

Gruß
Kugelschreiber15
Member: bastla
bastla Mar 10, 2015 at 19:18:10 (UTC)
Goto Top
Hallo Kugelschreiber15!

Leider werde ich aus Deiner Erklärung nicht wirklich schlau face-sad bzw sehe bis auf die Benennung der Zieldatei keinen Unterschied ...

Was meinst Du mit
dass beides sich in einer Datei befindet?

Grüße
bastla
Member: Kugelschreiber15
Kugelschreiber15 Mar 10, 2015 at 19:33:28 (UTC)
Goto Top
Hallo bastla,

es gibt auch, bis auf die Benennung der Ein- und Ausgabedatei, keinen Unterschied.
Ich sehe grad, dass im 1. Teil ein Fehler drin ist.

Es müsste im 1. Teil
for /f "usebackq delims=" %%i in ("%tmp%\TestDatei1.txt") do (    
heißen.


Mit "dass beides sich in einer Datei befindet?" meine ich, dass sich beide Codes in einer Batch Datei abspielen.
Wenn ich den 1. Teil in eine Bat Datei, den 2. Teil in eine andere Bat Datei einfüge, funktioniert alles.

Bekomme trotzdem im 2. Teil einen errorlevel =1

Gruß
Kugelschreiber15
Member: bastla
bastla Mar 10, 2015 at 21:11:59 (UTC)
Goto Top
Hallo Kugelschreiber15!

Abgesehen davon, dass ich mir nicht erklären kann, wie die Verarbeitung völlig unterschiedlicher (Ein- und Ausgabe-)Dateien in getrennten Batches andere Ergebnisse bringen sollte als bei Verwendung der kombinierten Variante, kann ich auch mit Deinem Hinweis auf den Errorlevel nichts anfangen - an welcher Stelle ermittelst Du ihn und wie wertest Du ihn aus?

Grüße
bastla