PowerShell doppelte Einträge aus CSV entfernen?
Ich habe etwas mit PowerShell programmiert. Am Ende exportiert er die Daten in eine CSV Datei. Meine Frage wäre jetzt, kann man, wenn z.B. bereits der Computername bereits in der CSV existiert diese ganze Zeile aus der CSV löschen und durch den aktuelleren (doppelten zweiten Wert) ersetzten?
3 Antworten
test.csv
"Name","Phone","blubb"
"Franz","555123","iwas"
"Max","00587","awas"
"Franz","555678","iwas"
"Lene","975","muh"
"Max","00123","awas"
demo1.ps1
#inhalt in Objektliste speichern
$MyObjects=Import-Csv 'test.csv'
'Rohdaten'
$MyObjects|ft
#Sortiere nach Name in umgekehrter Reihenfolge nach Name
#die letzte Eintragung mit gleichem Namen steht jeweils zuerst, ist also die Neuere!
$NewList=$MyObjects|sort -p Name -descending
'sortiert jeweils letzte zuerst'
$NewList|ft
#jeweils den ersten auftauchenden Wert in $Ersatz zwischnspeichern und dubletten damit ersetzen
$NewList=$NewList|foreach{
if ($_.Name -eq $Ersatz.Name){
$ersatz
}
else {
$_
$Ersatz=$_
}
}
'Ersetzt'
$NewList|ft
$NewList|Export-Csv 'newTest.csv' -NoType
pause
dito kompakter:
Import-Csv 'test.csv'|sort -p Name -des|%{
if ($_.Name -eq $Ersatz.Name){$ersatz}
else {
$_
$Ersatz=$_
}
}|Export-Csv 'newTest.csv' -NoType
Ein CSV ist eigentlich nur eine sehr einfache Repräsentation von gleichwertigen Objekten.
Ohne zu sortieren würde das ganze zu einem schrecklichen Monster, da man ja erstmal die Komplette Liste abgrasen müsste und nach doppelten Namen zu suchen.
Natürlich blöde wenn man die Originalreihenfolge baucht...
Hier zaubern wir zu den einzelnen Objekten jeweils eine Nummerierung hinzu.
Nun können wir wie gehabt manipulieren und anschließend sortieren wir die Objekte wieder in die Nummernreihenfolge, entfernen die Nummerierung und speichern als csv...
#inhalt in Objektliste speichern
$MyObjects=Import-Csv 'test.csv'
#um später die richtige Reihenfolge der Zeilen wiederherstellen zu können, zu den Objekten die Property Zeilennummer hinzufügen
$MyObjects |Add-Member -NotePropertyName LineNumber -NotePropertyValue 0
$NewList=$MyObjects|%{$i=1}{
$_.LineNumber +=($i++) #Zeilennummer für jedes Objekt setzen und hochzählen
$_ #Neuen Wert in die Pipe
}
'Rohdaten'
$NewList|ft
#Sortiere nach Name in umgekehrter Reihenfolge nach Name
#die letzte Eintragung mit gleichem Namen steht jeweils zuerst, ist also die Neuere!
$dsortList=$MyObjects|sort -p Name -descending
'sortiert jeweils letzte zuerst'
$dsortList|ft
#jeweils den ersten auftauchenden Wert in $Ersatz zwischnspeichern und dubletten damit ersetzen
$Replaced=$dsortList|foreach{
if ($_.Name -eq $Ersatz.Name ){
$Ersatz.LineNumber = $_.LineNumber++ #Zeilenummer Korrekt
$Ersatz
} else {
$_|select -p *
$Ersatz=$_
}
}
'Mal Anzeigen...'
$Final=$Replaced|sort LineNumber|select -p * -excl LineNumber #Zurücksortieren und die Zeilennummer wieder entfernen
$Final|ft
$Final|Export-Csv 'newTest.csv' -NoType
ob der 2. Wert nun aktueller war bleibe mal dahingestellt, zumindst wurde ersteres Vorkommen durch das Zweite ersetzt.
"Name","Phone","blubb"
"Franz","555123","iwas"
"Max","00587","awas"
"Franz","555123","iwas"
"Lene","975","muh"
"Max","00587","awas"
...eigentlich genau das Scenario, welches Du beschrieben hast.
sorry da war was faul...🤔kleiner Denkfehler:
statt:
...|sort -p Name -descending
muss heisen:
...|sort -p Name,LineNumber -descending
Ps: dem Script ist es völlig egal welche Felder das CSV definiert. Wichtig ist nur, da man nach dem richtigen Feld sortiert
Hallo,
Das kann man schlecht mit einem Script erledigen. Am besten wäre das importieren in ein Datenbanksystem(Access, DBASE), benannte Dubletten herausfiltern und dann wieder exportieren in CSV.
LG
Harry
Ich würde vorschlagen dies bereits beim Export in deine CSV Datei zu prüfen und wenn es dort den Computernamen schon gibt, überspringst du ihn und machst mit dem nächsten weiter.
Und in PowerShell ist das ganze nicht möglich?
Habe schon sehr viel im Internet geschaut, aber so richtig was funktionierendes nicht gefunden