Powershell - Group by


warface

Mitglied
Hallo zusammen,

ich baue zur Zeit einen Converter mit dem ich csv-Dateien in ein EDI-Format umwandeln kann.
Leider krieg ich die Gruppierung nicht hin, vielleicht kann mir ja jemand einen Tipp geben :)

CSV-Beispielstruktur

Datum;Liefantnr;Lieferantname;Lieferscheinnr;Port;Position;ArtikelNR;Artikel;Menge;Preis;AuftragGPreis
01.01.17;100001;LieferanABCD;20000011411;9,99€;000001;99998888;Muster;000001;9,99;27,97
01.01.17;100001;LieferanABCD;20000011411;9,99€;000002;99998887;Demo1;000002;8,99;27,97
01.01.17;100001;LieferanABCD;20000011412;5,99€;000001;99998888;Muster;000001;9,99;9,99
01.01.17;100221;LieferanEFGH;20000011415;9,99€;000001;77998888;Kugel;000001;9,99;9,99
02.01.17;100001;LieferanABCD;20000011413;9,99€;000001;99998888;Muster;000001;9,99;9,99

Ergebnis sollte dann z.B.
01.01.17
100001|LieferanABCD
20000011411|9,99€
000001|99998888|Muster|000001|9,99
000002|99998887|Demo1|000001|8,99
27,97
01.01.17
100001|LieferanABCD
20000011412|5,99€
000001|99998888|Muster|000001|9,99
9,99
01.01.17
100221|LieferanEFGH
20000011415|9,99€
000001|77998888|Kugel|000001|9,99
9,99
02.01.17
100001|LieferanABCD
20000011413|9,99€
000001|99998888|Muster|000001|9,99
9,99

hierbei handelt es sich lediglich um ein kleines Beispiel.
So habe ich das bisher umgesetzt und es hat auch funktioniert, weil in einer Datei nur ein Auftag mit mehreren Positionen war.
Die Dateien beihalten nun mehrere Aufträge und da komme ich nicht weiter.

Hier ein Ausschnitt aus meinem Quellcode
Code:
    if ($filename -eq "") {
    $filename= $NewFilename, $210_uebdat, $210_lief_name_1  -join "_"
    }
    # $ADRESSDATEN
    if ($ADRESSDATEN -eq "") {
    $ADRESSDATEN = $210_vda_satzart ,$210_vda_version,$210_uebnr,$210_uebnr_alt,$210_uebdat,$210_satzart,$210_konto,$210_lfnr_kdnr,$210_fi_nr,$210_lief_name_1,$210_lief_name_2,$210_lief_name_3,$210_lief_strasse,$210_lief_plz,$210_lief_ort,$210_lief_kzland,$210_lief_ust_identnr,$210_iln,$210_dummy -join ""
    }
    # $AUFTRAGSDATEN
    if ($AUFTRAGSDATEN -eq "") {
    $AUFTRAGSDATEN = $220_vda_satzart,$220_vda_version,$220_ls_nr,$220_ls_dat,$220_kd_name_1,$220_kd_name_2,$220_kd_name_3,$220_kd_strasse,$220_kd_plz,$220_kd_ort,$220_kd_land,$220_sendnr,$220_send_dat,$220_lief_term,$220_lb,$220_vers_art,$220_sb_name,$220_dummy -join ""
    }
    # $AUFTRAGABSCHLUSS
    if ($AUFTRAGABSCHLUSS -eq "") {
    $AUFTRAGABSCHLUSS = '24001' -join ""
    }
    # $ABSCHLUSS
    if ($ABSCHLUSS -eq "") {
    $ABSCHLUSS = '25001' -join ""
    }
    # $POSITIONEN
    $POSITION = $230_vda_satzart,$230_vda_version,$230_aufnr,$230_auf_dat,$230_best_nr,$230_best_dat,$230_identnr,$230_var,$230_kdidentnr,$230_kdvar,$230_menge_gel,$230_me,$230_gewicht,$230_aufpos,$230_ean,$230_kd_zeichnr,$230_kd_zeichidx,$230_kd_aendkonstr,$230_kostst -join ""
    $POSITIONEN += $POSITION
}
  
##############Datei schreiben##############
################ZielPfand##################
    $target = "$ZielVerzeichnis$filename.txt"
  
    Out-File -FilePath $target -Encoding default -InputObject $ADRESSDATEN, $AUFTRAGSDATEN
    $POSITIONEN | %{
    Out-File -FilePath $target -Append -InputObject $_ -Encoding default
    }
    Out-File -FilePath $target -Encoding default -Append -InputObject $AUFTRAGABSCHLUSS
    Out-File -FilePath $target -Encoding default -Append -InputObject $ABSCHLUSS}
 
Zuletzt bearbeitet von einem Moderator:

ComFreek

Mod | @comfreek
Moderator
Hi,

es wäre hilfreich, wenn du sagst, welche Variable was genau speichert. Am besten ein Minimal Working Example, du hast die Testdaten ja bereits geposted ;)
 

warface

Mitglied
@ComFreek Danke für dein Feedback

so würde der Quellcode basierend auf dem Beispiel aussehen :)
bisher gab es pro Datei nur einen Header und mehrere dazugehörige Positionen.
nun gibt es pro Datei auch mehrere Aufträge.

Code:
    if ($filename -eq "") {
    $filename= "Lieferscheine",$Datum  -join "_"
    }
    # $ADRESSDATEN
    if ($ADRESSDATEN -eq "") {
    $ADRESSDATEN = $Lieferantnr, $Lieferantname -join "|"
    }
    # $AUFTRAGSDATEN
    if ($AUFTRAGSDATEN -eq "") {
    $AUFTRAGSDATEN = $Datum, $Lieferscheinnr, $Porto -join "|"
    }
    # $AUFTRAGABSCHLUSS
    if ($AUFTRAGABSCHLUSS -eq "") {
    $AUFTRAGABSCHLUSS = $AuftragGPreis -join "|"
    }
    # $ABSCHLUSS
    if ($ABSCHLUSS -eq "") {
    $ABSCHLUSS = "ENDE" -join ""
    }
    # $POSITIONEN
    $POSITION = $Position, $ArtikelNR, $Artikel, $Menge, $Preis -join "|"
    $POSITIONEN += $POSITION
    }
##############Datei schreiben##############
################ZielPfand##################
    $target = "$ZielVerzeichnis$filename.txt"
    Out-File -FilePath $target -Encoding default -InputObject $ADRESSDATEN, $AUFTRAGSDATEN
    $POSITIONEN | %{
    Out-File -FilePath $target -Append -InputObject $_ -Encoding default
    }
    Out-File -FilePath $target -Encoding default -Append -InputObject $AUFTRAGABSCHLUSS
    Out-File -FilePath $target -Encoding default -Append -InputObject $ABSCHLUSS}
 

warface

Mitglied
hat keiner eine Idee wie man da ran gehen könnte?
Ein Beispiel mit einer Datei, die mehrere Gruppierungen hat, würde mir sicherlich auch schon weiterhelfen.