如何使用PowerShell比较两个CSV文件

2ledvvac  于 2023-04-27  发布在  Shell
关注(0)|答案(1)|浏览(137)

我有一个名为Full-List.csv的csv文件,其中包含如下列

Old_URL    Number

我有另一个csv文件Sub-List.csv,它有这样的列

Old_URL  New_URL Title  Owner

我只是想知道我如何比较两个csv文件使用Old_URL列和输出到另一个csv文件,看起来像这样。基本上它会包括一个“数字”列现在。

New_URL  Title  Owner  Number
$left = Import-Csv 'C:\Users\Downloads\New folder\Full-List.csv'
$right = Import-Csv 'C:\Users\Downloads\New folder\Sub-List.csv'

Compare-Object -ReferenceObject $left -DifferenceObject $right -Property Old_URL -IncludeEqual -ExcludeDifferent | 
    ForEach-Object {
        $iItem = $_
        $ileft = $left.Where({$_.Old_URL -eq $iItem.Old_URL })
        $iright = $right.Where({$_.Old_URL -eq $iItem.Old_URL})
        [pscustomobject]@{
             New_URL = $iright.New_URL
             Number =$ileft.Number
             Title = $iright.Title
             Owner =$iright.Owner
        }
    } | Export-Csv 'C:\Users\Downloads\New folder\Combined.csv' -NoTypeInformation

在两个文件中都有匹配的Old_URL,但由于某些原因,我的Combined.csv输出为空,因此任何帮助或建议都将非常感谢。

6l7fqoea

6l7fqoea1#

你真的应该考虑使用hash tableGroup-Object -AsHashtable在简化这个过程方面做得很好。一旦你有了查找表,你就可以枚举Full-List CSV并只输出那些具有相关Old_URL值的对象:

$map = Import-Csv path\to\Sub-List.csv | Group-Object Old_URL -AsHashTable -AsString

Import-Csv path\to\Full-List.csv | ForEach-Object {
    if($map.ContainsKey($_.Old_URL)) {
        [pscustomobject]@{
            New_URL = $map[$_.Old_URL].New_URL
            Title   = $map[$_.Old_URL].Title
            Owner   = $map[$_.Old_URL].Owner
            Number  = $_.Number
        }
    }
} | Export-Csv path\to\mergedCsv.csv -NoTypeInformation

相关问题