none
csv ohne Spaltennamen, sort Kombination von property und unique? RRS feed

  • Frage

  • Hallo,
    aus einer csv Datei ohne Spaltennamen sollen nach einem Primärschlüssel Duplikate entfernt werden.
    Im Beispiel ist die erste Spalte der Primärschlüssel (in einer anderen Datei aber z.B. die vierte Spalte),
    es soll also hier die vierte Zeile entfernt werden.
    ...
    ab123; name; vorname; ...
    ab321; name2;  vorname2; ...
    ab123; name ; vorname-vorname2; ...
    ab456; ...

    Ohne viel powershell Erfahrung experimentierte ich mit ...sort -property ... | sort -unique ...
    Hat jemand bitte eine Idee für mich?
    Danke im Voraus!
    Freitag, 23. März 2018 13:29

Antworten

Alle Antworten

  • Moin,

    damit Du nach Property sortieren kannst, musst Du beim Import einfach den Header mitgeben:

    Import-CSV C:\temp\test.txt -Header @("Key","Lastname","Firstname","...","...") -Delimiter ";" | sort Key -Unique


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Freitag, 23. März 2018 15:37
  • Moin moin,
    Danke für den Tip!  Habe aber das cmdlet Prinzip wohl noch nicht verstanden.
    Denn egal ob ich die Attributnamen bereits im ersten von mehreren sqlcmd Export einführe,
    oder im Import, oder mit einer eigenen Header Datei wie hier

    powershell -command "(get-content accounts_?.out | Add-Content accounts_unsorted.out)"

    das sort liefert mir nur den ersten Datensatz, ohne header, und ohne Fehlermeldung oder Warnung.

    powershell -command "get-content accounts_header.csv, accounts_unsorted.out | sort Key -unique | Add-Content accounts_%TIMESTAMP%.csv"
    oder auch
    powershell -command "(get-content accounts_header.csv, accounts_unsorted.out | sort Key -unique) | Add-Content accounts_%TIMESTAMP%.csv"

    Was mache ich hier wieder falsch?
    Danke!
    Dienstag, 27. März 2018 14:26
  • Moin,

    schau Dir mein Beispiel noch einmal. Wenn Deine Daten so aussehen wie im OP, sind sie durch Semikolon getrennt. Das Standard-Trennzeichen bei CSV ist Komma (deswegen heißt es ja auch "Comma-Separated Values"). Willst Du ein anderes Trennzeichen, musst Du es mit -Delimiter explizit angeben. Ich vermute, dass das auch das Problem ist.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    • Als Antwort markiert uwmuc Freitag, 6. April 2018 14:46
    Dienstag, 27. März 2018 14:32
  • Ich würde die Daten nicht erst komplett einlesen und sortieren. Du kannst die Dateien zeilenweise mit einem StreamReader einlesen. In jeder Zeile ermittelst du deinen Primärschlüssel und schreibst diesen in eine Hashtabelle als Key mit Value $true (das ist beliebig gewählt). Bevor du den Wert der aktuellen Zeile einträgst, fragst du aber noch ab, ob er bereits in der Hashtabelle exisitert. Falls das nicht so ist, hängst du die Zeile an eine Ausgabedatei an.

    Den StreamReader öffnest du mit

    New-Object System.IO.StreamReader("DeinFileName")
    An die Ausgabedatei schreibst du mit Add-Content oder einem StreamWriter.
    Mittwoch, 28. März 2018 05:57
  • Ich würde die Daten nicht erst komplett einlesen und sortieren. Du kannst die Dateien zeilenweise mit einem StreamReader einlesen. In jeder Zeile ermittelst du deinen Primärschlüssel und schreibst diesen in eine Hashtabelle als Key mit Value $true (das ist beliebig gewählt). Bevor du den Wert der aktuellen Zeile einträgst, fragst du aber noch ab, ob er bereits in der Hashtabelle exisitert. Falls das nicht so ist, hängst du die Zeile an eine Ausgabedatei an.

    Ich würde aber statt Hashtable einen Hashset nehmen. Noch einen kleinen Tick schneller, und der Code ist eleganter. Wir hatten das mal hier, s. http://www.it-pro-berlin.de/2017/08/powershell-wie-schnell-sind-arrays/

    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Mittwoch, 28. März 2018 10:36