PowerShell - strukturierte Ausgabe in XML
Hallo,
ich hab da ein kniffliges Problem und weiß nicht, ob ich es überhaupt mit PowerShell gelöst bekomme.
Ich möchte eine Datei auslesen und als XML ausgeben. In der Datei sind Rechnungen enthalten und haben mehrere Lieferscheine. Die Lieferscheine können aber unterschiedliche Monate zu einem Beleg haben und ich würde gerne pro Monat und Beleg eine Datei ausgeben.
Hier mal der Dateiaufbau:
Satzart;AA;AB;AC;AD
801;1000;01.06.2021;5600;EUR
802; ;1000;INFO 123;01.06.2021;500
802; ;1000;INFO 123;31.05.2021;400
802; ;1000;INFO 456;01.06.2021;350
801;1001;01.06.2021;5600;EUR
802; ;1001;INFO 456;28.05.2021;123
802; ;1001;INFO 456;29.05.2021;124
802; ;1001;INFO 123;01.06.2021;405
Die geplanten Dateien sollten dann so aussehen:
XML-Datei 1: 1000-05 (Darin Position "400")
XML-Datei 2: 1000-06 (Darin Position "500" + "350")
XML-Datei 3: 1001-05 (Position 123+124)
XML-Datei 4: 1001-06 (Position 405)
Meine Idee wäre jetzt auf die Satzart 802 zuzugreifen, aus AA+AC die Belegnummer zu bilden und dann über eine Funktion auf die Daten der Satzart 801 zuzugreifen.
Wenn ich aber jetzt in die dritte 802-Zeile komme, würde er ja die bestehende Datei überschreiben oder kann ich das irgendwie puffern, bis ich durchgelaufen bin und dann weiterschreiben?
Vielleicht denke ich jetzt auch nur zu kompliziert.
ich hab da ein kniffliges Problem und weiß nicht, ob ich es überhaupt mit PowerShell gelöst bekomme.
Ich möchte eine Datei auslesen und als XML ausgeben. In der Datei sind Rechnungen enthalten und haben mehrere Lieferscheine. Die Lieferscheine können aber unterschiedliche Monate zu einem Beleg haben und ich würde gerne pro Monat und Beleg eine Datei ausgeben.
Hier mal der Dateiaufbau:
Satzart;AA;AB;AC;AD
801;1000;01.06.2021;5600;EUR
802; ;1000;INFO 123;01.06.2021;500
802; ;1000;INFO 123;31.05.2021;400
802; ;1000;INFO 456;01.06.2021;350
801;1001;01.06.2021;5600;EUR
802; ;1001;INFO 456;28.05.2021;123
802; ;1001;INFO 456;29.05.2021;124
802; ;1001;INFO 123;01.06.2021;405
Die geplanten Dateien sollten dann so aussehen:
XML-Datei 1: 1000-05 (Darin Position "400")
XML-Datei 2: 1000-06 (Darin Position "500" + "350")
XML-Datei 3: 1001-05 (Position 123+124)
XML-Datei 4: 1001-06 (Position 405)
Meine Idee wäre jetzt auf die Satzart 802 zuzugreifen, aus AA+AC die Belegnummer zu bilden und dann über eine Funktion auf die Daten der Satzart 801 zuzugreifen.
Wenn ich aber jetzt in die dritte 802-Zeile komme, würde er ja die bestehende Datei überschreiben oder kann ich das irgendwie puffern, bis ich durchgelaufen bin und dann weiterschreiben?
Vielleicht denke ich jetzt auch nur zu kompliziert.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 782325539
Url: https://administrator.de/contentid/782325539
Ausgedruckt am: 22.11.2024 um 09:11 Uhr
7 Kommentare
Neuester Kommentar
Hi,
Dann machen wir doch gleich mal Gebrauch vom neuen Powershell Leitfaden. =)
Powershell Leitfaden für Anfänger
VG
Dann machen wir doch gleich mal Gebrauch vom neuen Powershell Leitfaden. =)
Powershell Leitfaden für Anfänger
VG
Servus @Forseti2003,
für solche Sachen eignet sich das CMDLet group-object hervorragend.
Hier ein nur Beispiel für deine Daten da die Struktur deiner XML uns ja nicht bekannt ist
CSV-Datei
Dazugehöriger Code
ergibt dann solche Files
Falls sich dazu Fragen ergeben, einfach los schreiben.
Grüße Uwe
für solche Sachen eignet sich das CMDLet group-object hervorragend.
Hier ein nur Beispiel für deine Daten da die Struktur deiner XML uns ja nicht bekannt ist
CSV-Datei
Satzart;AA;AB;AC;AD
801;1000;01.06.2021;5600;EUR
802;1000;INFO 123;01.06.2021;500
802;1000;INFO 123;31.05.2021;400
802;1000;INFO 456;01.06.2021;350
801;1001;01.06.2021;5600;EUR
802;1001;INFO 456;28.05.2021;123
802;1001;INFO 456;29.05.2021;124
802;1001;INFO 123;01.06.2021;405
# CSV Datei
$infile = 'D:\data\data2021.csv'
# Ausgabeordner für die XML Dateien
$outfolder = 'D:\data'
# CSV Datei importieren
$csv = Import-CSV $infile -Delimiter ";"
# CSV Daten nach Satz filtern und nach Vorgabe gruppieren
$csv | ? Satzart -eq '802' | group {$_.AA + "-" + $_.AC.split('.')[1]} | %{
# xml object erstellen
$xml = [xml]'<?xml version="1.0" encoding="utf-8"?><Entries></Entries>'
# Gruppeneinträge durchlaufen und der XML Datei zusätzliche Elemente hinzufügen
$_.Group | %{
$entry = $xml.CreateElement('Entry')
$info = $xml.CreateElement('Info')
$info.InnerText = $_.AB
$datum = $xml.CreateElement('Datum')
$datum.innerText = $_.AC
$betrag = $xml.CreateElement('Betrag')
$betrag.innerText = $_.AD
$entry.AppendChild($info)
$entry.AppendChild($datum)
$entry.AppendChild($betrag)
$xml.DocumentElement.AppendChild($entry)
} | out-null
# Xml Datei im Ausgabepfad ablegen
$xml.Save((join-path $outfolder ($_.Name + '.xml')))
}
<?xml version="1.0" encoding="utf-8"?>
<Entries>
<Entry>
<Info>INFO 123</Info>
<Datum>01.06.2021</Datum>
<Betrag>500</Betrag>
</Entry>
<Entry>
<Info>INFO 456</Info>
<Datum>01.06.2021</Datum>
<Betrag>350</Betrag>
</Entry>
</Entries>
Grüße Uwe
Zitat von @Forseti2003:
hm....früher gab es mal in diesem Forum noch wirklich Hilfe, aber scheinbar beschränkt man sich heute lieber auf Platitüden.
hm....früher gab es mal in diesem Forum noch wirklich Hilfe, aber scheinbar beschränkt man sich heute lieber auf Platitüden.
Was verstehst du unter Hilfe? Das jemand die Aufgabe erfüllt die du angenommen hast? Was passiert wenn du das Script abändern müsstest weil sich zum Beispiel deine Quelldatei geändert hat?