PowerShell doppelte Einträge aus CSV entfernen?

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.


Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
Erzesel  20.01.2022, 13:36

Ps: dem Script ist es völlig egal welche Felder das CSV definiert. Wichtig ist nur, da man nach dem richtigen Feld sortiert

0
Erzesel  20.01.2022, 15:55

sorry da war was faul...🤔kleiner Denkfehler:

statt:

...|sort -p Name -descending

muss heisen:

...|sort -p Name,LineNumber -descending
0

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

almgifo 
Fragesteller
 20.01.2022, 07:15

Und in PowerShell ist das ganze nicht möglich?

Habe schon sehr viel im Internet geschaut, aber so richtig was funktionierendes nicht gefunden

0
heizfeld  20.01.2022, 07:21
@almgifo

Nein, Powershell wäre das letzte was ich als Lösungsansatz wählen würde

Hat deine CSV Datei übrigens die Feldnamen als erste Zeile? Oder fehlt die?

0

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.

Woher ich das weiß:Berufserfahrung – IT Support, Studium & Hobby