web-dev-qa-db-ja.com

別のcsvの行と一致する行をcsvから削除する方法

したがって、2つの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
John McCabe

$list1 | Where-Object ...$list1のすべての要素を実行するため、foreachを使用する必要はありません。また、 Compare-Objectコマンドレット を介してCSVを比較することもできます。

$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
})
0
flolilo