【问题标题】:Compare 2 Csvs on mutiple columns, export all matching rows including duplicates values, export columns from both csvs with powershell在多列上比较 2 个 Csv,导出所有匹配的行,包括重复值,使用 powershell 从两个 csv 导出列
【发布时间】:2018-09-11 17:36:30
【问题描述】:

Powershell-CompareCsv-Export-Values-From-Each 我发布了这个问题,它几乎相同,除了我的右侧 CSV 有多个具有相同 First、Last 和 DOB 的行,但文件名不同,而我的左侧文件只有 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

正确的.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。

所以最终的结果应该是这样的:

组合.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 但没有运气,或者 count+1 所以它循环通过这些,或者嵌套的foreach-object,真是不知所措。

【问题讨论】:

  • 考虑从您的数据创建一个哈希表,键为“$($_.First),$($_.Last),$($_.DOB)”,值为整个排。然后,当您迭代时,您将拥有两个键,并且可以解析/重新加入这两个值。 Powershell 不是执行此操作的理想工具。
  • @NoRefundsNoReturns 如何将值作为整行?

标签: powershell csv


【解决方案1】:

就像我的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
'@

请注意,我交换了$LeftRight。虽然也是 可以做一个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

【讨论】:

  • 我已经尝试过,但我无法让加入脚本工作。我没有得到任何结果,我不知道我错过了什么。您是否将这一切都放在一个 ps1 文件中,然后在其上运行您的脚本?我习惯使用模块和 cmdlet 没有问题。
  • 您可以使用dot sourcing 来包含脚本。例如:. .\Join.ps1
  • 我安装了最新版本的脚本,我刚刚尝试了点源,我得到了这个错误:Join-Object:无法处理参数“属性”的参数转换。无法将“System.Object[]”类型的“System.Object[]”值转换为“System.Collections.Hashtable”类型。
  • 我认为您没有最新版本。最新版本是2.2.4。此版本特别支持属性列表。
  • 删除 -property 部分后,我终于让它工作并放入 | Select-Object 我能够返回我结束的所有内容。
【解决方案2】:

向@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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2016-10-22
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    相关资源
    最近更新 更多