比较列值并合并

Compare column values and merge

我正在尝试合并两个具有公共列名的 csv 文件,但一个有 22 行,另一个只有 16 行。

1st CSV                                2nd CSV

Name       Service_StatusA              Name         Service_StatusB 
IEClient     running                   IEClient          Manual
IE Nomad     running                   ​IE Nomad          running
Data Usage   running                   Print Spooler     Manual
Print Spooler running                  Server            running
Server        running

我想将其合并为一个 csv

Name           Service_StatusA     Service_StatusB
IEClient          running             Manual
IE Nomad          running             running
Data Usage        running
Print Spooler     running             Manual
Server            running             running
$file1 = Import-Csv -Path .\PC1.csv
$file2 = Import-Csv -Path .\PC2.csv
$report = @()

    foreach ($line in $file1) 
    {
        $match = $file2 | Where-Object {$_.Name -eq $line.Name}
        if ($match)
        {
            $row = "" | Select-Object 'Name','Service_StatusA','Service_StatusA',
            $row.Name = $line.Name
            $row.'Service_StatusA' = $line.'Service_StatusA'
            $row.'Service_StatusB' = $match.'Service_StatusB'
            $report += $row
        }
    }
$report | export-csv .\mergetemp.csv -notype -force

合并前如何比较行值

在 SQL 数据库术语中,您需要左联接,而您的代码正在执行内部联接。在集合术语中,您正在做 1.csv 和 2.csv 的交集(仅出现在两者中的行)但您想做 1.csv + 交集(所有行)的并集来自 1.csv,仅匹配来自 2.csv) 的行。

您希望第一个 csv 中的每一行都是输出 csv 中的一行。这应该是开始——总是在你的循环中输出一些东西。目前您从 if() 测试输出。您希望第二个 csv 中的匹配行在存在时添加其数据,但不更改输出量。

$file1 = Import-Csv -Path .\PC1.csv
$file2 = Import-Csv -Path .\PC2.csv

$report = foreach ($line in $file1) 
    {
        # always make an output line for each row in file1
        $row = "" | Select-Object 'Name','Service_StatusA','Service_StatusA',
        $row.Name = $line.Name
        $row.'Service_StatusA' = $line.'Service_StatusA'

        # if there is a matching line in file2, add its data in    
        $match = $file2 | Where-Object {$_.Name -eq $line.Name}
        if ($match)
        {
            $row.'Service_StatusB' = $match.'Service_StatusB'                
        }

        # always have output a row for a row in file1
        $row
    }
$report | export-csv .\mergetemp.csv -notype -force

(可能您想要的是 SQL 外部联接,其中 2.csv 中不在 1.csv 中的行也创建输出行,但您的示例没有表明)。

(我去掉了$report +=,因为它的代码越多运行越慢,这是一个烦人的组合)。