freshman2017
Goto Top

Doppelte Dateneinträge per Batch aus Datei löschen? HILFE

Liebe Gemeinde,

Ihr konntet mir als Anfänger sehr gut helfen. Ich brauche jetzt aber noch Hilfe bei der doppelte Einträge aus einer .csv - (komma-getrennt)
gelöscht werden soll.

Meine .csv ist wie folgt aufgebaut:

NR,NR1,NR2,NR3,NAME,VORNAME,PLZ,ORT,STRASSE,DATUM1,DATUM2,ARTIKELNAME,NR4,MENGE,TAXE,TAXE1,BRUTTO,TAXE3,NR5,NR6,NR7,
a,b,c,d,MUSTERMANN,MAX,12345,MUSTERSTADT,MUSTERSTRAßE 1,17.03.2017,16.03.2017,ABC2,12345,12,19,20,23,250.00,123452,23,123,
a,b,c,d,MUSTERMANN,MAX,12345,MUSTERSTADT,MUSTERSTRAßE 1,17.03.2017,16.03.2017,ABC2,12345,12,19,20,23,250.00,123452,23,123,
ab,b,c,d,MUSTERMANN,MAX,12345,MUSTERSTADT,MUSTERSTRAßE 1,17.03.2017,16.03.2017,ABC2,12345,12,19,20,23,250.00,123452,23,123,
ab,b,c,d,MUSTERMANN,MAX,12345,MUSTERSTADT,MUSTERSTRAßE 1,17.03.2017,16.03.2017,ABC2,12345,12,19,20,23,250.00,123452,23,123,
ac,b,c,d,MUSTERMANN,MAX,12345,MUSTERSTADT,MUSTERSTRAßE 1,17.03.2017,16.03.2017,ABC2,12345,12,19,20,23,250.00,123452,23,123,
ac,b,c,d,MUSTERMANN,MAX,12345,MUSTERSTADT,MUSTERSTRAßE 1,17.03.2017,16.03.2017,ABC2,12345,12,19,20,23,250.00,123452,23,123,

Per Batch-Skript kopiere ich diese Datei bereits und benenne dies um:

@echo off
copy %userprofile%\Desktop\CSV\Exporte\quelle.csv %userprofile%\Desktop\CSV\Exporte\zielohnedup-%DATE%.csv

Jetzt würde ich gerne in der zielohnedup-%DATE%.csv folgendes Anhand der Spalte A stehe haben:

NR,NR1,NR2,NR3,NAME,VORNAME,PLZ,ORT,STRASSE,DATUM1,DATUM2,ARTIKELNAME,NR4,MENGE,TAXE,TAXE1,BRUTTO,TAXE3,NR5,NR6,NR7,
a,b,c,d,MUSTERMANN,MAX,12345,MUSTERSTADT,MUSTERSTRAßE 1,17.03.2017,16.03.2017,ABC2,12345,12,19,20,23,250.00,123452,23,123,
ab,b,c,d,MUSTERMANN,MAX,12345,MUSTERSTADT,MUSTERSTRAßE 1,17.03.2017,16.03.2017,ABC2,12345,12,19,20,23,250.00,123452,23,123,
ac,b,c,d,MUSTERMANN,MAX,12345,MUSTERSTADT,MUSTERSTRAßE 1,17.03.2017,16.03.2017,ABC2,12345,12,19,20,23,250.00,123452,23,123,

Kann mir nochmal wer helfen?

Beste Grüße,

freshman2017

Content-Key: 333334

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

Ausgedruckt am: 19.03.2024 um 06:03 Uhr

Mitglied: rubberman
Lösung rubberman 26.03.2017 um 21:01:51 Uhr
Goto Top
Hallo freshman2017,

sollte etwa so funktionieren.
@echo off &setlocal
set "src=%userprofile%\Desktop\CSV\Exporte\quelle.csv"  
set "dst=%userprofile%\Desktop\CSV\Exporte\zielohnedup-%DATE%.csv"  

set "before="  
setlocal EnableDelayedExpansion
<"!src!" >"!dst!" (  
  for /f %%i in ('type "!src!"^|find /c /v ""') do for /l %%j in (1 1 %%i) do (  
    set "ln=" &set /p "ln="  
    for /f "delims=," %%k in ("!ln!") do if "!before!" neq "%%k" (  
      echo(!ln!
      set "before=%%k"  
    )
  )
)
Grüße
rubberman
Mitglied: freshman2017
freshman2017 26.03.2017 um 21:59:01 Uhr
Goto Top
Hi rubberman,

woran kann man erkennen, dass er die erste Spalte zum überprüfen nimmt? Oder überprüft er hier die komplette Zeile?


@echo off &setlocal
set "src=%userprofile%\Desktop\CSV\Exporte\quelle.csv"
set "dst=%userprofile%\Desktop\CSV\Exporte\zielohnedup-%DATE%.csv"

set "before="
setlocal EnableDelayedExpansion
<"!src!" >"!dst!" (
for /f %%i in ('type "!src!"^|find /c /v ""') do for /l %%j in (1 1 %%i) do (
set "ln=" &set /p "ln="
for /f "delims=," %%k in ("!ln!") do if "!before!" neq "%%k" (
echo(!ln!
set "before=%%k"
)
)
)
<\code>

Beste Grüße, freshman2017
Mitglied: rubberman
rubberman 26.03.2017 aktualisiert um 22:16:24 Uhr
Goto Top
Hallo freshman2017

for /f "delims=," %%k in ("!ln!") do ...

In Variable "ln" ist die komplette Zeile gespeichert. "delims" gibt die Trennzeichen an (hier ist es lediglich das Komma). Wenn keine "tokens" angegeben werden, wird nur das erste token (Teilstring, der durch delims getrennt wird) verarbeitet. Dieses landet dann in der FOR Variablen (%%k). Also wie du es ausdrücken würdest, die erste Spalte.

Grüße
rubberman
Mitglied: freshman2017
freshman2017 27.03.2017 um 15:12:33 Uhr
Goto Top
Hi rubberman,
was muss ich denn ändern, wenn er nicht die 1. Spalte (NR) prüfen soll, sondern die 3. Spalte (NR2) wenn diese unterschiedlich ist?

Beste Grüße
freshman2017
Mitglied: rubberman
Lösung rubberman 27.03.2017 um 18:35:12 Uhr
Goto Top
Hallo freshman2017.

for /f "tokens=3 delims=," %%k in ("!ln!") do ...

Anhand meiner Erklärung hätte das bereits klar sein sollen face-wink

Grüße
rubberman
Mitglied: freshman2017
freshman2017 29.03.2017 um 18:53:54 Uhr
Goto Top
Super, danke für den Tipp, das funktioniert einwandfrei! face-smile
- Hast Du noch einen Tipp, wie ich die .csv noch sortieren (nach der 3. Spalte) kann, bevor er die Duplikate entfernt?


for /f "tokens=3 delims=," %%k in ("!ln!") do ...  


@echo off &setlocal
set "src=%userprofile%\Desktop\CSV\Exporte\quelle.csv"  
set "dst=%userprofile%\Desktop\CSV\Exporte\zielohnedup-%DATE%.csv"  

set "before="  
setlocal EnableDelayedExpansion
<"!src!" >"!dst!" (  
  for /f %%i in ('type "!src!"^|find /c /v ""') do for /l %%j in (1 1 %%i) do (  
    set "ln=" &set /p "ln="  
    for /f "tokens=3 delims=," %%k in ("!ln!") do if "!before!" neq "%%k" (  
      echo(!ln!
      set "before=%%k"  
    )
  )
)
Mitglied: rubberman
rubberman 29.03.2017 aktualisiert um 19:56:23 Uhr
Goto Top
Nee, nicht wirklich. Wenn der Inhalt der ersten drei Datenfelder in jeder Zeile die gleiche Anzahl Zeichen enthält, könntest du den SORT Befehl mit der Option /+n verwenden. Das n ist dabei das Offset vom Zeilenanfang, bei dem die Sortierung einsetzen soll. Ich kenne natürlich dein realen Daten nicht ...

Grüße
rubberman