Powershell-CompareCsv-Export-Values-From-Each我发布了这个问题并且几乎完全相同,只是我的右边的CSV有多个行具有相同的First,Last和DOB,但是不同的文件名和我的Left File只有First,Last,DOB一次。
我认为答案会有所不同,我决定发布第二个问题。
我有2个CSV
left.csv
Ref_ID,First_Name,Last_Name,DOB
321364060,User1,Micah,11/01/1969
946497594,User2,Acker,05/28/1960
887327716,User3,Aco,06/26/1950
588496260,User4,John,05/23/1960
565465465,User5,Jack,07/08/2020
right.csv
First_Name,Last_Name,DOB,City,Document_Type,Filename
User1,Micah,11/01/1969,Parker,Transcript,T4IJZSYO.pdf
User1,Micah,11/01/1969,Parker,Letter,BADBADC.pdf
User1,Micah,11/01/1969,Parker,Resume,AJMLMOC.pdf
User2,Acker,05/28/1960,,Transcript,R4IKTRYN.pdf
User3,Aco,06/26/1950,,Transcript,R4IKTHMK.pdf
User4,John,05/23/1960,,Letter,R4IKTHSL.pdf
我需要在First_Name,Last_Name,DOB上匹配它们然后从left.csv返回Ref_ID,并从right.csv返回每行的First,Last,DOB,Document_Type,Filename。
所以最终的结果如下所示:
Combined.csv
Ref_ID,First_Name,Last_Name,DOB,Document_Type,Filename
321364060,User1,Micah,11/01/1969,Transcript,T4IJZSYO.pdf
321364060,User1,Micah,11/01/1969,Letter,BADBADC.pdf
321364060,User1,Micah,11/01/1969,Resume,AJMLMOC.pdf
946497594,User2,Acker,05/28/1960,Transcript,R4IKTRYN.pdf
887327716,User3,Aco,06/26/1950,Transcript,R4IKTHMK.pdf
588496260,User4,John,05/23/1960,Letter,R4IKTHSL.pdf
使用其他帖子的答案,只返回第一个匹配。我尝试将-eq更改为-in,这给了我所有的匹配,但是它返回如下:
Ref_ID,First_Name,Last_Name,DOB,Document_Type,Filename
321364060,{User1,User1,User1},{Micah,Micah,Micah},{11/01/1969,11/01/1969,11/01/1969},{Transcript,Letter,Resume},{T4IJZSYO.pdf,BADBADC.pdf,AJMLMOC.pdf}
下面的查询可以为我提供每个单独的结果,但我不知道如何从left.csv添加我需要的REF_ID
$right.Where( {$_.DOB -in $left.DOB -and $_.First_Name -in $left.First_Name -and $_.Last_Name -in $left.Last_Name}) |
export-csv C:\Combined.csv -notypeinformation
结果:它允许我做-in,它排除User5,因为它不匹配,但我需要返回REF_Id
First_Name,Last_Name,DOB,City,Document_Type,Filename
User1,Micah,11/01/1969,Parker,Transcript,T4IJZSYO.pdf
User1,Micah,11/01/1969,Parker,Letter,BADBADC.pdf
User1,Micah,11/01/1969,Parker,Resume,AJMLMOC.pdf
User2,Acker,05/28/1960,,Transcript,R4IKTRYN.pdf
User3,Aco,06/26/1950,,Transcript,R4IKTHMK.pdf
User4,John,05/23/1960,,Letter,R4IKTHSL.pdf
我觉得我只是错过了一个运算符,它会按照我需要/想要的方式放置结果但是我尝试将-join或-split添加到pscustomobject但没有运气,或者计数+ 1因此它循环通过那些,或者嵌套foreach-object,真的很茫然。
就像我在answer的Powershell-CompareCsv-Export-Values-From-Each一样,使用Join-Object:
$Left = ConvertFrom-Csv @'
First_Name,Last_Name,DOB,City,Document_Type,Filename
User1,Micah,11/01/1969,Parker,Transcript,T4IJZSYO.pdf
User1,Micah,11/01/1969,Parker,Letter,BADBADC.pdf
User1,Micah,11/01/1969,Parker,Resume,AJMLMOC.pdf
User2,Acker,05/28/1960,,Transcript,R4IKTRYN.pdf
User3,Aco,06/26/1950,,Transcript,R4IKTHMK.pdf
User4,John,05/23/1960,,Letter,R4IKTHSL.pdf
'@
$Right = ConvertFrom-Csv @'
Ref_ID,First_Name,Last_Name,DOB
321364060,User1,Micah,11/01/1969
946497594,User2,Acker,05/28/1960
887327716,User3,Aco,06/26/1950
588496260,User4,John,05/23/1960
565465465,User5,Jack,07/08/2020
'@
请注意,我已经交换了
$Left
和Right
。虽然也可以做一个RightJoin
, 我建议从PowerShell流媒体角度使用LeftJoin
而不是RightJoin
$Left | LeftJoin $Right `
-On First_Name,Last_Name,DOB `
-Property Ref_ID,First_Name,Last_Name,DOB,Document_Type,Filename `
| Format-Table
Ref_ID First_Name Last_Name DOB Document_Type Filename
------ ---------- --------- --- ------------- --------
321364060 User1 Micah 11/01/1969 Transcript T4IJZSYO.pdf
321364060 User1 Micah 11/01/1969 Letter BADBADC.pdf
321364060 User1 Micah 11/01/1969 Resume AJMLMOC.pdf
946497594 User2 Acker 05/28/1960 Transcript R4IKTRYN.pdf
887327716 User3 Aco 06/26/1950 Transcript R4IKTHMK.pdf
588496260 User4 John 05/23/1960 Letter R4IKTHSL.pdf
给@IRon答案,但我找到了一个不需要单独脚本的解决方案,并且我想发布它以备将来参考。
$left = Import-Csv .\left.csv
$right = Import-Csv .\right.csv
$right | foreach {
$r = $_;
$left | where{ $_.First_Name -eq $r.First_Name -and $_.Last_Name -eq $r.Last_Name -and $_.DOB -eq $r.DOB } |
select Ref_Id,
First_Name,
Last_Name,
DOB,
@{Name="City";Expression={$r.City}},
@{Name="Document_Type";Expression={$r.Document_Type}},
@{Name="FileName";Expression={$r.FileName}}
} | format-table