2016-09-27 84 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 
相关问题