1

Итак, у меня есть два 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, кажется, применяются ко всему списку list1, а не к каждой строке, поэтому он отбрасывает некоторые записи, которые я ожидаю присутствовать. Вероятно, есть лучший способ сделать это, но я не буду придумывать много.

1 ответ1

0

$list1 | Where-Object ... будет проходить через каждый элемент $list1 , поэтому нет необходимости использовать foreach . Кроме того, вы можете сравнить свои CSV с помощью командлета 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
})

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .