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

Printed on: April 23, 2024 at 11:04 o'clock

Member: rubberman
Solution rubberman Mar 26, 2017 at 19:01:51 (UTC)
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
Member: freshman2017
freshman2017 Mar 26, 2017 at 19:59:01 (UTC)
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
Member: rubberman
rubberman Mar 26, 2017 updated at 20:16:24 (UTC)
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
Member: freshman2017
freshman2017 Mar 27, 2017 at 13:12:33 (UTC)
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
Member: rubberman
Solution rubberman Mar 27, 2017 at 16:35:12 (UTC)
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
Member: freshman2017
freshman2017 Mar 29, 2017 at 16:53:54 (UTC)
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"  
    )
  )
)
Member: rubberman
rubberman Mar 29, 2017 updated at 17:56:23 (UTC)
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