如何从 csv 中删除与另一个 csv 中的行匹配的行

如何从 csv 中删除与另一个 csv 中的行匹配的行

所以我有两个 csv 文件(list1.csv 和 list2.csv)它们都有以下列:

FirstName  LastName  MiddleName  City

我想检查 list1.csv 并查看是否有任何行与 list2.csv 中的行匹配,如果是,则将其从 list1 中删除。

$list1 = import-csv list1.csv
$list2 = import-csv list2.csv

foreach ($item in $list2)
{
$list1 = $list1 | Where {$_.FirstName -ne $item.FirstName -and $_.LastName -ne $item.LastName -and $_.MiddleName -ne $item.MiddleName -and $_.City -ne $item.City} 
}

这给了我一个包含接近我想要的内容的列表,但是 where 子句中的 and 语句似乎适用于整个 list1,而不是每一行,所以它会删除一些我期望存在的条目。可能有更好的方法可以做到这一点,但我想不出太多。

答案1

$list1 | Where-Object ...将遍历 的每个元素$list1,因此无需使用foreach。此外,您还可以通过Compare-Object命令

$list1 = @(Import-Csv .\list1.csv)
$list2 = @(Import-Csv .\list2.csv)

$list1 = @($list1 | Where-Object {
    @(Compare-Object $_ $list2 -Property FirstName,LastName,MiddleName,City -IncludeEqual -ExcludeDifferent).count -eq 0
})

相关内容