2016-09-27 1 views
0

Ich habe 2 CSVs.Match auf zwei Spalten in zwei separaten CSVs dann eine Spalte zusammen

SOURCE CSV

"Employee ID","username","givenname","surname","emailaddress","title","Division","Location" 
"204264","[email protected]","Abdul Jalil","Bin Hajar","[email protected]","Warehouse Associate I","Singapore","Singapore, " 
"30053","[email protected]","Abel","Barragan","[email protected]","Manager, Customer Programs - CMS","Germany","Norderstedt, " 

CHANGE CSV

givenname,surname,samaccountname,emailaddress,mail,country,city,state 
Abigai,Teoyotl Rugerio,Abigai.Teoyotl,[email protected],[email protected],MX,, 
Adekunle,Adesiyan,Adekunle.Adesiyan,[email protected],[email protected],US,VALENCIA,CALIFORNIA 

Ich möchte den Namen und given von SOURCE entsprechen zu ändern, und wenn es eine Übereinstimmung der "E-Mailadresse" aus dem CHANGE greifen ist CSV und platziere es in einer neuen Spalte in der SOURCE CSV.

Bis jetzt bin ich auf der Suche nach den ersten und letzten Spalten.

$source = import-csv .\ur.csv 
$change = import-csv .\all.csv 

$Matchgivenname = Compare-Object $source.givenname $change.givenname -IncludeEqual -ExcludeDifferent -PassThru 
$matchsurname = Compare-Object $source.surname $change.surname -IncludeEqual -ExcludeDifferent -PassThru 
+0

Ihr Beispiel ergibt keinen Sinn. Kein Eintrag in Ihrer source.csv stimmt mit irgendwelchen in change.csv überein. Auch source.csv enthält bereits eine Emailaddress-Spalte. –

+0

Also das sind nur die ersten paar Zeilen von jedem CSV. Die Quelle wird einige Einträge enthalten, die nicht in der Änderung sind, und umgekehrt, jedoch wird es einige gegebene Namen und Nachnamen geben, die in beiden erscheinen, und wenn sie in beiden erscheinen, möchte ich die E-Mail-Adresse von der Änderung csv holen und fügen Sie es der Quelle csv in einer neuen Spalte hinzu – 200mg

Antwort

0

Nicht sicher, ob Sie es mit Compare-Object auf einmal tun können, aber Sie können alle Original Mitarbeiter Schleife über und für jeden einzelnen, für alle Änderungen suchen. z.B.

$results = foreach ($employee in $source) 
{ 
    $update = $change | Where-Object { $employee.surname -eq $_.surname -and $employee.givenname -eq $_.givenname } | Select -First 1 

    if ($update) 
    { 
     $employee | Add-Member -MemberType NoteProperty -Name NewEmailAddress -Value $update.emailaddress 
    } 

    $employee 
} 

(ungetestet)

+0

Ich denke, das bringt mich auf den richtigen Weg, es funktioniert nicht per se, aber das bringt mich zum Laufen. Was macht die erste 1 nach der Auswahl? – 200mg

+0

Es wählt die erste 1 Sache aus der Pipeline als Wächter aus, so dass $ update niemals ein Array mit mehreren Übereinstimmungen sein wird, falls $ change dieselbe Person mehrmals hat. – TessellatingHeckler

0

Falls die change CSV ist groß und Sie müssen nur die geänderten E-Mail-Adresse, eine Hash-Tabelle mit given + Namen als Schlüssel und E-Mail als Wert aufzubauen. Dann benutze es beim Importieren der Quell-CSV.

Die Hashtable-Suche ist viel schneller als die Aufzählung aller Zeilen mit geänderten Daten. Die Gesamtzahl der Iterationen liegt daher bei #changed + #source + log2(#changed), wobei # für die Anzahl der Zeilen steht.

Da das Hinzufügen der neuen Spalte über Add-Member langsamer ist als die direkte Zuweisung, fügen Sie diese neue Spalte nur einmal hinzu, indem Sie einen benutzerdefinierten Header verwenden, der Quellfelder aus der ersten Zeile und die geänderte E-Mail enthält.

$changedEmail = @{} 
Import-Csv .\all.csv | 
    ForEach { $changedEmail[$_.givenname + '|' + $_.surname] = $_.emailaddress } 

$newHeader = ((Import-Csv .\ur.csv | Select -first 1).PSObject.Properties | 
    Select -expand name) + 'changedemailaddress' 
$combined = Import-Csv .\ur.csv -Header $newHeader | Select -skip 1 | 
    ForEach { 
     $_.changedemailaddress = $changedEmail[$_.givenname + '|' + $_.surname] 
     $_ 
    } 
$combined 
Verwandte Themen