2016-09-27 54 views
0

我有2個CSV。在兩個單獨的csv中的兩列上匹配,然後合併一列

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 

我想姓和給定名稱從源匹配到的變化,如果有匹配從CHANGE搶 「EMAILADDRESS」 CSV並將其放入SOURCE CSV中的新列。

到目前爲止,我堅持匹配名字和姓氏列。

$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

你的例子沒有任何意義。您的source.csv中沒有條目與change.csv中的任何條目匹配。另外source.csv已經包含一個emailaddress列。 –

+0

所以這些只是每個csv的前幾行。源代碼將包含一些根本沒有改變的條目,反之亦然,但是會出現一些給定名稱和姓氏,如果它們出現在兩者中,我想從更改csv中獲取電子郵件地址並將其添加到源CSV文件中的新列 – 200mg

回答

0

不知道你是否能比較-對象做一次全部,但你可以遍歷所有的老員工和每一個,搜索任何變化。例如

$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 
} 

(未經測試)

+0

我認爲這使我走上了正確的軌道,它本身並不工作,但這讓我走了。 -first 1在選擇之後做了什麼? – 200mg

+0

它從流水線中選擇第一個東西,作爲警衛,以便$更新永遠不會是多個匹配的數組,如果$ change多次具有同一個人。 – TessellatingHeckler

0

萬一change CSV大,你只需要改變的電子郵件地址,建立與給定名稱+姓作爲重點和電子郵件作爲一種價值散列表。然後在導入源CSV時使用它。

散列表查找比枚舉所有已更改數據的行要快得多,因此總體迭代次數將大約爲#changed + #source + log2(#changed),其中#代表行數。

此外,由於通過Add-Member添加新列比直接分配要慢,因此只需使用由第一行提取的源字段和更改後的電子郵件組成的自定義標題添加此新列即可。

$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