none
Auslesen 2 Spalten in 2 CSV per script RRS feed

  • Frage

  • Hallo Leute,

    leider ist Powershell nicht meine stärke und helfen das ihr mir helfen könnt.

    Ich habe Powershell 2.0 und möchte gerne in der einen CSV Name und Standort auslesen die befinden sich in Spalte C und D.

    In der anderen CSV steht Nachname und Ort und befindet sich in Spalte B und E.

    Unter Name und Nachname stehen jeweils die Nachnamen nur das sie eine anderen Spaltennamen habe wie es auch bei Standort und Ort ist.

    #einlesen erste Datei
    $test_csv = Import-CSV 'D:\Test.csv' -delimiter ";" 
    
    #einlesen zweite Datei
    $test2_csv = Import-CSV 'D:\Test2.csv' -delimiter ";" 
    
    #ergebnis Datei
    $csv_test3 = 'D:\Test3.csv' 
    
    Compare-Object -ReferenceObject $test2_csv -DifferenceObject $test2_csv -Property "Name";"Standort" -PassThru | 
        Where-Object -Property 'SideIndicator' -Value '=>' -EQ | 
            Export-Csv -Path 'D:\Test3.csv' -Delimiter ';' -NoTypeInformation -Encoding UTF8

    wenn ich es test zeigt er mir immer an das er kein Parameternamen findet und so wie ich gelesen habe und hoffe nicht das ich mich verlesen habe geht es mit Property erst ab Powershell 2.0.

    Was kann ich jetzt machen das er 2 Spalten liest und die dann mit der anderen CSV vergleich ob genau das gleiche drin steht und mir halt nur die Anzeigt die nicht übereinstimmen.

    Danke für die Zeit und hilfe

    Mittwoch, 26. Oktober 2016 09:20

Antworten

  • OK ... eigentlich hast Du das im anderen Thread schon gesehen ... ;-)

    Um zwei unterschiedlich bezeichnete Spalten miteinander vergleichen zu können, musst Du einen der Spaltentitel an den anderen anpassen. Das kannst Du mit sogenannten berechneten Properties oder Hashtables machen.  Das geht auch direkt beim Import.
    $test_csv = Import-CSV 'D:\Test.csv' -delimiter ";"
    $test2_csv = Import-CSV 'D:\Test2.csv' -delimiter ";" | Select-Object -Property *,@{Name='Name';Expression={$_.Nachname}},@{Name='Standort';Expression={$_.Ort}}
    
    Compare-Object -ReferenceObject $test_csv -DifferenceObject $test2_csv -Property "Name","Standort" -PassThru

    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''



    Mittwoch, 26. Oktober 2016 09:57

Alle Antworten

  • OK ... eigentlich hast Du das im anderen Thread schon gesehen ... ;-)

    Um zwei unterschiedlich bezeichnete Spalten miteinander vergleichen zu können, musst Du einen der Spaltentitel an den anderen anpassen. Das kannst Du mit sogenannten berechneten Properties oder Hashtables machen.  Das geht auch direkt beim Import.
    $test_csv = Import-CSV 'D:\Test.csv' -delimiter ";"
    $test2_csv = Import-CSV 'D:\Test2.csv' -delimiter ";" | Select-Object -Property *,@{Name='Name';Expression={$_.Nachname}},@{Name='Standort';Expression={$_.Ort}}
    
    Compare-Object -ReferenceObject $test_csv -DifferenceObject $test2_csv -Property "Name","Standort" -PassThru

    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''



    Mittwoch, 26. Oktober 2016 09:57
  • Danke für die schnelle Antwort finde gerade nur nicht den Fehler, warum er es im Anschluss nicht speichert auch wenn ich den Speicherort benannt habe ?
    Mittwoch, 26. Oktober 2016 10:40
  • In dem Code, den ich gepostet habe ist der Export nicht dabei. Das hast bemerkt, oder? Du müsstest also noch 
    | Export-Csv -Path 'D:\Test3.csv' -Delimiter ';' -NoTypeInformation -Encoding UTF8
    hinten anhängen

    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Mittwoch, 26. Oktober 2016 10:48
  • Danke das habe ich gemerkt :)

    ich habe nur noch eine frage wenn ich das mit hinzufüge in der zweiten Zeile zeigt er mir einen fehler an das Where-Opject kein Parameter angezeigt wird. Würde ja gerne das er mir in der gespeicherten csv nur das anzeigt was nicht enthalten ist.

    Compare-Object -ReferenceObject $test_csv -DifferenceObject $test2_csv -Property "Name","Standort" |
    Where-Object -Property 'SideIndicator' -Value '=>' -EQ | 
            Export-Csv -Path 'D:\Test3.csv' -Delimiter ';' -NoTypeInformation -Encoding UTF8
    
    
    
    
    
    

    Mittwoch, 26. Oktober 2016 12:48
  • Wenn Du den Code den ich gepostet habe, mal in der Console fallen lässt, sollte eigentlich genau das Ergebnis erscheinen, was Du erwartest. Also alle Unterschiede in beiden CSVen. Welche Zeile aus welcher CSV kommt, sieht man am 'SideIndicator'.  Zum Testen kannst Du ja mal den Parameter '-IncludeEqual' anhängen, dann siehst Du das komplette Vergleichsergebnis. Du filterst dann mit Deinem 'Where-Object' die eine Seite aus.

    Wenn Du nicht weiterkommst, bzw. Dir auf die Fehlermeldung keinen Reim machen kannst, solltest Du sie hier posten.


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Mittwoch, 26. Oktober 2016 12:56
  • Hallo BOfH,

    soweit geht alles und funktioniert es. Ich habe nur ein Problem wenn ich es durchlaufen lasse zeigt er mir alle an die nicht übereinstimmen. Im test.csv habe ich nur 250 Clients und im test2.csv 3000 Clients und er soll mir ja nur die anzeigen die im test.csv nicht passen also das ich max. 250 Clients habe und nicht 3000. Ich hoffe das du verstehst wo mein Problem ist und finde nicht den Fehler. Ich hoffe das du mir helfen kannst, sodass er nur max 250 Clients anzeigt.

    # Vergleichen mit den Eigenschaften 'IP-Adresse','Asset:Name' und nur die Objekte ausgeben die nur in der ersten CSV vorkommen 
    Compare $test_csv $test2_csv -Property 'IP-Adresse','Host' -PassThru | ?{$_.SideIndicator -eq '<='} | select IP-Adresse,Host, | sort ip-adresse |
            Export-Csv -Path $csv_out2 -Delimiter ';' -NoTypeInformation -Encoding UTF8
    danke für die zeit

    Donnerstag, 3. November 2016 06:20
  • Hmmmm .... ich weiß gar nicht, was ich Dir da jetzt noch empfehlen kann. Ich hoffe mal, dass Du verstanden hast, dass Du mit dem SideIndicator eine Seite der Unterschiede herausfiltern kannst. Oben hattest Du einmal den SideInicator '=>' und im letzten Post hattest Du '<='. Wenn das trotzdem nicht das gewünschte Ergebnis bringt, könnte das Problem vielleicht noch in Deinen Daten liegen. Hast Du vielleicht die Möglichkeit, hier einen kurzen Auszug (maximal vielleicht jeweils 10 Zeilen und 3 oder 4 Spalten) aus beiden CSV-Dateien zu posten, sodass man das mal mit 'originalen' Daten durchspielen könnte. Sensible Daten solltest Du natürlich vorher entfernen.

    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Donnerstag, 3. November 2016 11:17
  • Hallo sry das ich jetzt erst schreibe hatte Urlaub.

    ich habe jetzt mal paar screenshots gemacht und vielleicht verstehst du dann was ich gerne als lösung haben möchte.

    bin neu in der Firma und würde gerne ein neueres Powershell haben wollen.

    Ausgangsdatei

    erste csv datei

    vergleichsdatei

    2te CSV datei

    lösung

    3te Datei die erstellt wurde mit nicht übereinstimmen Host oder IP

    in der dritten Datei dürften max. 250 angezeigt werden da in der ersten nicht mehr vorhanden sind.

    danke für die zeit


    • Bearbeitet Marcus-P Freitag, 11. November 2016 09:07
    Freitag, 11. November 2016 09:05
  • Hmmmm ... ich hätte mir natürlich gewünscht, dass Du es mir etwas erleichterst und mich nicht Screenshots abtippen lässt ... aber sei's drum. ;-)

    Mit diesen Daten erhalte ich genau das Ergebnis, welches Du erwartest.

    $Pfad = '<Hier Deinen Pfad eintragen>'
    $AusgangsCSV = Import-Csv -Delimiter ';' -Path "$Pfad\ausgangsdatei.csv"
    $VergleichsCSV = Import-Csv -Delimiter ';' -Path "$Pfad\vergleichsdatei.csv"
    Compare-Object -ReferenceObject $AusgangsCSV -DifferenceObject $VergleichsCSV -Property host,ip -PassThru | 
        Where-Object -Property SideIndicator -EQ -Value '=>' | 
        Export-Csv -Path "$Pfad\loesung.csv" -Delimiter ';' -NoTypeInformation -Force
    

    Natürlich ist in der 'Lösungsdatei' auch noch zusätzlich der SideIndicator. Aber den kannst Du ja auch noch herausfiltern, wenn Du magst.


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Freitag, 11. November 2016 10:24
  • wow danke hätte ich es gewusste hätte ich dir alles geschickt sry und danke für die mühe
    Freitag, 11. November 2016 10:35