比较列值并合并
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 +=
,因为它的代码越多运行越慢,这是一个烦人的组合)。
我正在尝试合并两个具有公共列名的 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 +=
,因为它的代码越多运行越慢,这是一个烦人的组合)。