Powershell - Dateien vergleichen und ergänzen
Guten Tag
Ich bin wieder einmal bei meiner CSV dran und hänge
trotz Google und Co
Ausgangslage ist eine csv mit Namen, Kennung und Einsatzort
:
Mit der kann ich ganz "normal" arbeiten. Jetzt kommt das jährliche Update, ein paar sind weg, ein paar haben den Ort gewechselt und es gibt ein paar neue. Ich bekomme jedoch "nur" die aktuelle Liste in dieser Form:
Somit fehlt eine Spalte und eine kann sich verändert haben.
Ich möchte jetzt eine dritte Datei auf Basis der zweiten, wobei diese die erste kontrolliert, gibt es den schon? Wenn ja, dann gib ihm die bestehende Nummer. Eine vierte mit allen die es nicht mehr gibt und eine fünfte mit den Neuzugängen.
Ich schaffe es zwar mit "compare" (auch über mehrere Spalten hinweg) zu vergleichen, bekomme aber das "gib ihm die Nummer" nicht hin. (Die vierte und fünfte, machma die Reihenfolge
)
Bitte um ein Stichwort.
Ich bin wieder einmal bei meiner CSV dran und hänge
Ausgangslage ist eine csv mit Namen, Kennung und Einsatzort
Vorname;Nachname;Kennung;Ort
Sean;Connery;001;Berlin
Roger;Moore;002;Wien
George;Lazenby;003;Wien
Timothy;Dalton;004; London
Pierce;Brosnan;005;London
Daniel;Craig;006;Berlin
James;Bond;007;weltweit
Mit der kann ich ganz "normal" arbeiten. Jetzt kommt das jährliche Update, ein paar sind weg, ein paar haben den Ort gewechselt und es gibt ein paar neue. Ich bekomme jedoch "nur" die aktuelle Liste in dieser Form:
Vorname;Nachname;Ort
Sean;Connery;weltweit
Roger;Moore;weltweit
George;Lazenby;Berlin
Daniel;Craig;Hintertupfing
James;Bond;Wien
Max;Mustermann;Hintertupfing
Susi;Sorglos;München
Karli;Katastrophsky;Bonn
Jim;Bond;irgendwo
Somit fehlt eine Spalte und eine kann sich verändert haben.
Ich möchte jetzt eine dritte Datei auf Basis der zweiten, wobei diese die erste kontrolliert, gibt es den schon? Wenn ja, dann gib ihm die bestehende Nummer. Eine vierte mit allen die es nicht mehr gibt und eine fünfte mit den Neuzugängen.
Ich schaffe es zwar mit "compare" (auch über mehrere Spalten hinweg) zu vergleichen, bekomme aber das "gib ihm die Nummer" nicht hin. (Die vierte und fünfte, machma die Reihenfolge
Bitte um ein Stichwort.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 351271
Url: https://administrator.de/forum/powershell-dateien-vergleichen-und-ergaenzen-351271.html
Ausgedruckt am: 10.04.2025 um 05:04 Uhr
11 Kommentare
Neuester Kommentar

Stichwort where-object und group-object

Zitat von @Franz-Josef-II:
where-object
Mit dem kann ich doch nur in den Ergebnissen nach kleiner, größer etc filtern?
https://technet.microsoft.com/de-at/library/ee177028.aspx
Falsch! Du kannst damit den passenden Eintrag in der anderen Datei suchen und damit auch zuordnen.where-object
Mit dem kann ich doch nur in den Ergebnissen nach kleiner, größer etc filtern?
https://technet.microsoft.com/de-at/library/ee177028.aspx
group-object
Hier wird doch nur die Reihenfolge nach irgendwas umgestellt?
Quatsch mit Soße! Du packst beide Dateien in ein Array und gruppierst dann nach Namen mit group object und gibst von der Gruppe die aus mit der Kennung!Hier wird doch nur die Reihenfolge nach irgendwas umgestellt?
Also erst mal selbst ausprobieren bevor du hier leichtfertig solche Thesen aufstellst...
Servus,
der Beschreibung von @kokosnuss kann ich nur zustimmen, und du wolltest ja eigentlich nur ein "Stichwort"
. Naja, hier trotzdem mal ein Beispiel (Beispieldaten nur zur Demo ins Skript integriert, kann natürlich durch Import-CSV ersetzt werden)
Grüße Uwe
der Beschreibung von @kokosnuss kann ich nur zustimmen, und du wolltest ja eigentlich nur ein "Stichwort"
$csv1 = @"
Vorname;Nachname;Kennung;Ort
Sean;Connery;001;Berlin
Roger;Moore;002;Wien
George;Lazenby;003;Wien
Timothy;Dalton;004; London
Pierce;Brosnan;005;London
Daniel;Craig;006;Berlin
James;Bond;007;weltweit
"@ | ConvertFrom-CSV -Delimiter ";"
$csv2 = @"
Vorname;Nachname;Ort
Sean;Connery;weltweit
Roger;Moore;weltweit
George;Lazenby;Berlin
Daniel;Craig;Hintertupfing
James;Bond;Wien
Max;Mustermann;Hintertupfing
Susi;Sorglos;München
Karli;Katastrophsky;Bonn
Jim;Bond;irgendwo
"@ | ConvertFrom-CSV -Delimiter ";"
$all = @()
$all += $csv1
$all += $csv2
$matching = $all | group Vorname,Nachname | %{$group = $_.group;$_.Group | select Vorname,Nachname,Kennung,@{n='Ort';e={@{$true=$group[1].Ort;$false=$_.Ort}[($group.Count -gt 1)]}}}
$new = compare $csv1 $csv2 -Property Vorname,Nachname -PassThru | ?{$_.Sideindicator -eq '=>'}
$nonexisting = compare $csv1 $csv2 -Property Vorname,Nachname -PassThru | ?{$_.Sideindicator -eq '<='}
Grüße Uwe
Moin.
Das äußere ist eine sogenannte calculated property mit der man im Select Befehl schnell eine Spalte mit neuem Namen hinzufügen kann.
Innerhalb dieser Expression nutze ich eine Alternative für ein IF Konstrukt. Und zwar ist das eine Hashtable welche je nach Ergebnis (true oder false) den entsprechenden Wert zurückgibt
Wenn $group.count größer als 1 ist dann gebe den $true Teil der Hashtable zurück ansonsten den $false Teil.
Das äußere ist eine sogenannte calculated property mit der man im Select Befehl schnell eine Spalte mit neuem Namen hinzufügen kann.
@{n="NamederneuenSpalte";e={Expression}}
Innerhalb dieser Expression nutze ich eine Alternative für ein IF Konstrukt. Und zwar ist das eine Hashtable welche je nach Ergebnis (true oder false) den entsprechenden Wert zurückgibt
@{$true=$group[1].Ort;$false=$_.Ort}[($group.Count -gt 1)]
Nein, ein leeres Array.
Du verstehst es besser wenn du dir die einzelnen Bestandteile einfach mal in der Konsole zerlegst und dir alles was hinter group kommt erst mal weglässt, dann lässt du dir die dort herausgekommenen Eigenschaften auflisten, dann verstehst du es besser.
Zeile 29 und 30 vergleichen die beiden csv-Dateien und schmeißen die Unterschiede raus, einmal die, die nur in der ersten stehen und nicht in der zweiten und einmal umgekehrt.
Korrekt.
Nachsatz:
Mit den "kurzen" Angaben der James Bond Darsteller funktioniert es, wie gewünscht. Ich habe mit nach den Zeilen 28 bis 30 je eine Datei auswerfen lasen, das paßt.. Mit den "echten" Dateien, jeweils so ca 1.100 Einträge geht es nicht. Hier wird z.B. bei der Zeile 28 eine Datei mit ca 2.200 Einträgen ( = 1 + 2) erstellt. Tja, schauma ob ma de Uasoch (=Völla) findn
Tja ohne deine echten Daten kann ich hier leider nichts mutmaßen. Da wirst du etwas falsch angepasst haben.
Gegen Aufwandsentschädigung schaue ich mir die gerne an => PN.
Zeile 25 schmeißt die erste und 26 die zweite csv-Datei hinein.
Ja.Zeile 28 das verstehe ich jetzt nicht auf Anhieb, da muß ich etwas länger darüber nachdenken und probieren
trotzdem Danke
Im Endeffekt werden die Einträge die nun doppelt vorkommen (Vorname und Nachname) jeweils in eine Gruppe gepackt. Aus dieser Gruppe werden einerseits die Daten wie Vorname und Name entnommen und wenn es in der Gruppe mindestens 2 Einträge gibt wird von diesem zweiten der aktuellere Ort übernommen.Du verstehst es besser wenn du dir die einzelnen Bestandteile einfach mal in der Konsole zerlegst und dir alles was hinter group kommt erst mal weglässt, dann lässt du dir die dort herausgekommenen Eigenschaften auflisten, dann verstehst du es besser.
Zeile 29 und 30 vergleichen die beiden csv-Dateien und schmeißen die Unterschiede raus, einmal die, die nur in der ersten stehen und nicht in der zweiten und einmal umgekehrt.
Nachsatz:
Mit den "kurzen" Angaben der James Bond Darsteller funktioniert es, wie gewünscht. Ich habe mit nach den Zeilen 28 bis 30 je eine Datei auswerfen lasen, das paßt.. Mit den "echten" Dateien, jeweils so ca 1.100 Einträge geht es nicht. Hier wird z.B. bei der Zeile 28 eine Datei mit ca 2.200 Einträgen ( = 1 + 2) erstellt. Tja, schauma ob ma de Uasoch (=Völla) findn
Gegen Aufwandsentschädigung schaue ich mir die gerne an => PN.