Batch: Doppelte Datensätze in einer CSV kennzeichnen
Guten Morgen in die Runde,
ich habe eine .csv mit relativ vielen Spalten, bei der es sein kann, dass doppelte Werte anhand der ersten Spalte vorhanden sind.
Habe ich mit Batch eine Möglichkeit doppelte Datensätze in der letzten Spalte mit einer "1" zu kennzeichnen?
Ausgangsdatei:
Gewünschte Datei:
Ich wünsche einen schönen Tag,
Bernd.
ich habe eine .csv mit relativ vielen Spalten, bei der es sein kann, dass doppelte Werte anhand der ersten Spalte vorhanden sind.
Habe ich mit Batch eine Möglichkeit doppelte Datensätze in der letzten Spalte mit einer "1" zu kennzeichnen?
Ausgangsdatei:
500;100;500;100;400;
350;100;500;100;400;
500;100;500;100;400;
400;100;500;100;400;
Gewünschte Datei:
500;100;500;100;400;1;
350;100;500;100;400;;
500;100;500;100;400;1;
400;100;500;100;400;;
Ich wünsche einen schönen Tag,
Bernd.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 483445
Url: https://administrator.de/contentid/483445
Ausgedruckt am: 22.11.2024 um 06:11 Uhr
21 Kommentare
Neuester Kommentar
Machs gleich mit Powershell, wenn die Spalten keine Überschriften haben (gehe ich von aus da du hier keine aufgelistet hast) dann:
$quelle = 'D:\test.csv'
$ziel = 'D:\test_out.csv'
$numcols = (gc $quelle -head 1).split(";").count
$csv = Import-CSV $quelle -Delimiter ";" -Header (1..$numcols)
($csv | group '1' | %{
if ($_.Count -gt 1){
$_.Group | %{$_.$numcols = 1}
$_.Group
}else{
$_.Group
}
} | ConvertTo-CSV -delimiter ";" -NoType | select -Skip 1) -replace '"','' | sc $ziel
Moin,
Mit (g)awk ist das ein Einzeiler:
lks
PS: (g)awk ist auch im linux-subsystem für Windows enthalten.
PPS: Bei Deiner Ausgabe ist ein Fehler in der 4. Zeile:
Da müßte eine 1 stehen!
Mit (g)awk ist das ein Einzeiler:
gawk <EINGABE.CSV >AUSGABE.CSV -F ";" ' { if ( match ($2$3$4$5, $1) ) { print $1";"$2";"$3";"$4";"$5";1;" } else { print $1";"$2";"$3";"$4";"$5";;" } } '
lks
PS: (g)awk ist auch im linux-subsystem für Windows enthalten.
PPS: Bei Deiner Ausgabe ist ein Fehler in der 4. Zeile:
400;100;500;100;400;;
Da müßte eine 1 stehen!
mit relativ vielen Spalten
Da müßte eine 1 stehen!
Er will doch laut seiner Aussage nur die erste Spalte aller Datensätze vergleichen?! Denn dann ist das oben von ihm korrektZitat von @syscloud2019:
Bekommt man das auch wie folgt hin:
Bekommt man das auch wie folgt hin:
> 500;100;500;100;400;1;
> 500;100;500;100;400;1;
> 350;100;500;100;400;;
> 400;100;500;100;400;;
>
Moin,
Mein "Programm" Liefert:
500;100;500;100;400;1;
350;100;500;100;400;;
500;100;500;100;400;1;
400;100;500;100;400;1;
Jetzt mußt Du nur noch sagen, was Du in der letzten Zeile stehen haben wilstl und ggf. Deine Spezifikation nachbessern
lks
PS: Die Reihenfolge der Zeilen hat sich bei Dir geändert. Ist das gewünscht?
Bekommt man das auch wie folgt hin:
Kein Problem s. Anpassung im Code des ursprünglichen Post oben.Natürlich geht das. Paß einfach das Skript an.
lks
Ein abschließendes Semikolon bedeutet das noch eine neue letzte Spalte kommt, also ist dein dann deine Nummer in der vorletzten Spalte! Eine echte CSV hat keine abschließenden Semikolons hinter der letzten Spalte.
Also schreib die Daten in die vorletzte Spalte ($numcols -1)
Also schreib die Daten in die vorletzte Spalte ($numcols -1)
Zitat von @140447:
Ein abschließendes Semikolon bedeutet das noch eine neue letzte Spalte kommt, also ist dein dann deine Nummer in der vorletzten Spalte! Eine echte CSV hat keine abschließenden Semikolons hinter der letzten Spalte.
Ein abschließendes Semikolon bedeutet das noch eine neue letzte Spalte kommt, also ist dein dann deine Nummer in der vorletzten Spalte! Eine echte CSV hat keine abschließenden Semikolons hinter der letzten Spalte.
Nein, Ein Semikolon am Schluß bedeutet, daß da noch ein leeres Feld hintendran ist.
Von daher haben manche "echten" CSVs öfter man Semikolons am Schluß.
lks
PS: Das ist immer von der "Programmlogik" des entsprechenden Programmierers und der Spezifikation des Auftraggebers abhängig.
noch ein leeres Feld hintendran ist.
Leeres Feld oder leere Spalte, ist im Endeffekt das selbe, reine Auslegungssache .Kann er sich jetzt selbst dran pappen wie er lustig ist.
Nöp, siehst du aber auch selbst wenn du's ausprobiert hättest.
Zeile 7 ist dein Freund.
Zeile 7 ist dein Freund.
Hier rein schauen:
Frage zu Powershell - fast perfektes Skript vorhanden
Frage zu Powershell - fast perfektes Skript vorhanden
Das ist derselbe TO.
lks
Ein doppeltes Lottchen mit zwei Accounts? Naja egal, der Nachwelt sollte es trotzdem vielleicht noch nutzen.
Eine weitere PowerShell Lösung.
Anzahl Spalten ist hier egal
Die Eingabe wird eingelesen,
die erste Spalte wird in eine Hash-Tabelle eingetragen und inkrementiert.
Beim abarbeiten der Eingabe wird der Zähler minus 1 an die Zeile angehängt
(sollten mehr als 2 Dubletten vorkommen steht dann keine 1, sondern 2..)
Zwischenergebnis:
Gruß
LotPings
PS: Du solltest, wenn eine Antwort deine Lösung ist, entsprechend markieren.
Anzahl Spalten ist hier egal
Die Eingabe wird eingelesen,
die erste Spalte wird in eine Hash-Tabelle eingetragen und inkrementiert.
Beim abarbeiten der Eingabe wird der Zähler minus 1 an die Zeile angehängt
(sollten mehr als 2 Dubletten vorkommen steht dann keine 1, sondern 2..)
$Eingabe = Get-Content '.\Eingabe.csv'
$Ausgabe = '.\Ausgabe.csv'
$Hash = @{}
$Eingabe | ForEach-Object{$Hash[($_.Split(';')[0])]+=1}
$Eingabe | ForEach-Object{'{0}{1:#};' -f $_,($Hash[($_.Split(';')[0])] -1)} | Set-Content $Ausgabe
500;100;500;100;400;1;
350;100;500;100;400;;
500;100;500;100;400;1;
400;100;500;100;400;;
Zwischenergebnis:
> $Hash
Name Value
---- -----
500 2
350 1
400 1
Gruß
LotPings
PS: Du solltest, wenn eine Antwort deine Lösung ist, entsprechend markieren.