Como remover as linhas do csv que correspondem às linhas de outro csv

1

Então, eu tenho dois arquivos csv (list1.csv e list2.csv). Ambos têm essas colunas:

FirstName  LastName  MiddleName  City

Eu quero verificar list1.csv e ver se alguma linha corresponde a uma linha de list2.csv e, em caso afirmativo, removê-la da lista1.

$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} 
}

Isso me dá uma lista que contém perto do que eu quero, mas as instruções e na cláusula where parecem se aplicar a toda a list1 e não a cada linha, de forma que ela some algumas entradas que eu esperaria estar presente. Há provavelmente uma maneira melhor de fazer isso, mas eu não estou chegando com muito.

    
por John McCabe 28.11.2017 / 23:07

1 resposta

0

$list1 | Where-Object ... será executado em todos os elementos de $list1 , por isso não há necessidade de usar foreach . Além disso, você pode comparar seus CSVs por meio do Compare-Object cmdlet :

$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
})
    
por 28.11.2017 / 23:35