2017-05-10 7 views
2

Ich passe zwei Dateien basierend auf PersonID an und gebe sie an eine dritte (ListAfinal) aus. Im Wesentlichen füge ich die Adresse und die Telefonnummern für jene Einträge hinzu, die es haben, und füge Leerzeichen für jene hinzu, die es nicht haben. Ich möchte die Zeilen aus ListB entfernen, die mit ListA übereinstimmten, so dass nach dem Matching eine ListB ohne Übereinstimmungen in ListA übrig bleibt.Zeile nach einer Übereinstimmung aus der Datei entfernen

$f1=(import-csv 'C:\Desktop\ListA.csv' -header FirstName, LastName, Birthdate, PersonID, Address, PhoneNumber)[1..999] 
$f2=(import-csv 'C:\Desktop\ListB.csv' -header PersonID, Address, PhoneNumber)[1..999] 
$f1| 
    %{ 
     $PersonID=$_.PersonID 
     $m=$f2|?{$_.PersonID -eq $PersonID} 
     $_. Address=$m.Address 
     $_. PhoneNumber=$m.PhoneNumber 
    } 
$f1 | ConvertTo-Csv -NoTypeInformation | select -Skip 1 | % {$_.Replace('"','')} | Out-File 'C:\Desktop\ListAFinal.csv' 

Jede Methode, die ich online gefunden haben, funktioniert die Abführleitung aus der Basis einer bestimmten Zeichenfolge, aber in meinem Fall möchte ich nur die Linie entfernen, wenn sie abgestimmt wurde. Irgendwelche Ideen?

Antwort

1

erstellen Hash-Tabelle (eine Hash-Tabelle von Hash-Tabellen tatsächlich) von Ihrem zweiten CSV:

$csv1 = Import-Csv 'C:\Desktop\ListB.csv' -Header PersonID, Address, PhoneNumber | 
    Select-Object -Skip 1 -First 999 

$contacts = @{} 
$csv1 | ForEach-Object { 
    $contacts[$_.PersonID] = @{ 
    Address  = $_.Address 
    PhoneNumber = $_.PhoneNumber 
    } 
} 

calculated properties Dann nutzen Sie die Informationen an die Daten aus dem ersten CSV für das Hinzufügen von:

$csv2 = Import-Csv 'C:\Desktop\ListA.csv' -Header FirstName, LastName, Birthdate, PersonID, Address, PhoneNumber | 
    Select-Object -Skip 1 -First 999 

$csv2 | 
    Select-Object *, @{n='Address';e={$contacts[$_.PersonID]['Address']}}, 
    @{n='PhoneNumber';e={$contacts[$_.PersonID]['PhoneNumber']}} | 
    Export-Csv 'C:\Desktop\ListAFinal.csv' -NoType 

Beachten Sie, dass I stark empfehlen gegen entfernen Header oder Zitate aus Ihrer Ausgabe CSV, es sei denn, Sie haben sehr zwingende Gründe dafür.

Um Datensätze aus $csv2 zu entfernen, die eine Übereinstimmung in $csv1 einfach tun dies haben:

$IDs = $csv1 | Select-Object -Expand PersonID 
$csv2 | Where-Object { $IDs -notcontains $_.PersonID } 
+0

Dies als Schnipsel über meinen Code viel besser funktioniert. Nach dem Abgleich entfernt das Beispiel jedoch nicht die Zeilen aus ListB, die mit ListA "übereinstimmen". – JRod

+0

Das ist ziemlich trivial. Siehe aktualisierte Antwort. –

+0

Das ist perfekt! Ich danke dir sehr! Mir ist nicht aufgefallen, dass ich die Aktion der Variablen zuweisen soll, und setze dann die Bedingung gegen diese Variable. Vielen Dank. – JRod

Verwandte Themen