Xml in csv schreiben mittels Powershell
Hi @ all hier im Forum,
ich habe schon viel im Forum mitgelesen und auch schon den ein oder anderen guten Tipp oder Denkanstoß mitnehmen können. Nun habe ich aber ein kleines Problem, bei dem ich mal die geballte Rechenleistung der Gemeinde brauche.
Hier mal die Herausforderung vor der ich stehe:
Wir haben ein Warenwirtschaftssystem aus dem die Daten für die Buchhaltung exportiert werden. Das Programm exportiert die einzelnen Buchungssätze als .zip File für jeden einzelnen Buchungssatz. Wenn ich das Zip File entpacke erhalte ich einen Ordner, in dem eine .xml enthalten ist sowie der Buchungsbelg, in diesem Fall die Eingangsrechnung von unserem Lieferanten als .pdf File. Ich habe dann einen Order mit vielen Unterordner. Die Unterordner heisse immer wie der exportierte Datensatz, also :
Rechnungsdaten_209633
Rechnungsdaten_209634
Rechnungsdaten_209635
Rechnungsdaten_209636
Rechnungsdaten_209638
Rechnungsdaten_209637
usw.
Ich habe mir jetzt schon ein Script geschrieben, welches mir die zip files extrahiert, die .pdf und xml jeweils in getrennte Ordner kopiert, die pdf Files nach festen Vorgaben umbenennt und verarbeitet.
Nun kommt aber die Kür, bei der ich an meine Powershell Grenzen stoße.
Ich würde gerne die einzelnen xml Files in eine csv Datei importieren um sie dann anschließend in unser Buchhaltungsprogramm importieren zu können.
Dabei sollte idealerweise jede Zeile der csv aus einer xml datei bestehen.
Die Xml Dateien haben immer den folgenden Namen, lediglich die Nummer am ende ändert sich: Rechnungsdaten_209632.xml
Als Beispiel hier mal die Daten aus der xml datei.
<?xml version="1.0" encoding="utf-8"?>
<LedgerImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="5.0" generator_info="c-entron software gmbh" xml_data="Kopie nur zur Verbuchung berechtigt nicht zum Vorsteuerabzug" xsi:schemaLocation="http://xml.datev.de/bedi/tps/ledger/v050 Belegverwaltung_online_ledger_import_v050.xsd" xmlns="http://xml.datev.de/bedi/tps/ledger/v050">
<consolidate consolidatedAmount="113.57" consolidatedDate="2022-06-16" consolidatedInvoiceId="10911324" consolidatedCurrencyCode="EUR">
<accountsPayableLedger>
<date>2022-06-16</date>
<amount>113.57</amount>
<accountNo>3200</accountNo>
<costCategoryId>1</costCategoryId>
<tax>0.00</tax>
<currencyCode>EUR</currencyCode>
<invoiceId>10911324</invoiceId>
<bookingText>Convena Distribution A/S - 209669</bookingText>
<partyId>92756</partyId>
<internalInvoiceId>209669</internalInvoiceId>
<exchangeRate>1.000000</exchangeRate>
<dueDate>2022-07-16</dueDate>
<bpAccountNo>92756</bpAccountNo>
<deliveryDate>2022-06-22</deliveryDate>
<supplierName>Convena Distribution A/S</supplierName>
<supplierCity>Hvidovre</supplierCity>
</accountsPayableLedger>
</consolidate>
</LedgerImport>
Vielleicht hat einer von euch einen Lösungsansatz für mich, ich stehe da gerade ziemlich auf dem Schlauch....
Besten Dank und Grüße aus Oranienburg
Sebastian
ich habe schon viel im Forum mitgelesen und auch schon den ein oder anderen guten Tipp oder Denkanstoß mitnehmen können. Nun habe ich aber ein kleines Problem, bei dem ich mal die geballte Rechenleistung der Gemeinde brauche.
Hier mal die Herausforderung vor der ich stehe:
Wir haben ein Warenwirtschaftssystem aus dem die Daten für die Buchhaltung exportiert werden. Das Programm exportiert die einzelnen Buchungssätze als .zip File für jeden einzelnen Buchungssatz. Wenn ich das Zip File entpacke erhalte ich einen Ordner, in dem eine .xml enthalten ist sowie der Buchungsbelg, in diesem Fall die Eingangsrechnung von unserem Lieferanten als .pdf File. Ich habe dann einen Order mit vielen Unterordner. Die Unterordner heisse immer wie der exportierte Datensatz, also :
Rechnungsdaten_209633
Rechnungsdaten_209634
Rechnungsdaten_209635
Rechnungsdaten_209636
Rechnungsdaten_209638
Rechnungsdaten_209637
usw.
Ich habe mir jetzt schon ein Script geschrieben, welches mir die zip files extrahiert, die .pdf und xml jeweils in getrennte Ordner kopiert, die pdf Files nach festen Vorgaben umbenennt und verarbeitet.
Nun kommt aber die Kür, bei der ich an meine Powershell Grenzen stoße.
Ich würde gerne die einzelnen xml Files in eine csv Datei importieren um sie dann anschließend in unser Buchhaltungsprogramm importieren zu können.
Dabei sollte idealerweise jede Zeile der csv aus einer xml datei bestehen.
Die Xml Dateien haben immer den folgenden Namen, lediglich die Nummer am ende ändert sich: Rechnungsdaten_209632.xml
Als Beispiel hier mal die Daten aus der xml datei.
<?xml version="1.0" encoding="utf-8"?>
<LedgerImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="5.0" generator_info="c-entron software gmbh" xml_data="Kopie nur zur Verbuchung berechtigt nicht zum Vorsteuerabzug" xsi:schemaLocation="http://xml.datev.de/bedi/tps/ledger/v050 Belegverwaltung_online_ledger_import_v050.xsd" xmlns="http://xml.datev.de/bedi/tps/ledger/v050">
<consolidate consolidatedAmount="113.57" consolidatedDate="2022-06-16" consolidatedInvoiceId="10911324" consolidatedCurrencyCode="EUR">
<accountsPayableLedger>
<date>2022-06-16</date>
<amount>113.57</amount>
<accountNo>3200</accountNo>
<costCategoryId>1</costCategoryId>
<tax>0.00</tax>
<currencyCode>EUR</currencyCode>
<invoiceId>10911324</invoiceId>
<bookingText>Convena Distribution A/S - 209669</bookingText>
<partyId>92756</partyId>
<internalInvoiceId>209669</internalInvoiceId>
<exchangeRate>1.000000</exchangeRate>
<dueDate>2022-07-16</dueDate>
<bpAccountNo>92756</bpAccountNo>
<deliveryDate>2022-06-22</deliveryDate>
<supplierName>Convena Distribution A/S</supplierName>
<supplierCity>Hvidovre</supplierCity>
</accountsPayableLedger>
</consolidate>
</LedgerImport>
Vielleicht hat einer von euch einen Lösungsansatz für mich, ich stehe da gerade ziemlich auf dem Schlauch....
Besten Dank und Grüße aus Oranienburg
Sebastian
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 3856809135
Url: https://administrator.de/forum/xml-in-csv-schreiben-mittels-powershell-3856809135.html
Ausgedruckt am: 15.04.2025 um 16:04 Uhr
12 Kommentare
Neuester Kommentar

Moin.
Gibbet hier doch en masse, wie kann man da noch auf den Schlauch stehen
XML in CSV umwandeln - Powershell
XML zu CSV in Powershell
XML in CSV umwandeln
Cheers
certguy
Gibbet hier doch en masse, wie kann man da noch auf den Schlauch stehen
XML in CSV umwandeln - Powershell
XML zu CSV in Powershell
XML in CSV umwandeln
foreach($file in Get-ChildItem -LiteralPath "D:\Ordner" -File -Filter *.xml){
([xml](Get-Content -LiteralPath $file.Fullname)).LedgerImport.consolidate.accountsPayableLedger | export-csv -LiteralPath "D:\Ausgabe.csv" -delimiter ";" -NoType -Encoding UTF8 -Append
}
certguy

Sorry Tippfehler muss natürlich $file.Fullname heißen, ist behoben.
Und beim nächsten Mal dann bitte auch Code Tags im Text verwenden damit dann nicht so eine Layout Katastrophe wie oben in "Zeile 2, Zeichen24" dabei rauskommt und es normal lesbar bleibt.
FAQs lesen hilft wirklich!! 😉
FAQs lesen hilft wirklich!! 😉

$inpath = "D:\input"
$outpath = "D:\export.csv"
foreach($file in Get-ChildItem -LiteralPath $inpath -File -Filter *.xml){
[xml]$xml = Get-Content -LiteralPath $file.Fullname
$objects = $null
if ($xml.LedgerImport.consolidate.accountsReceivableLedger){
$xml.LedgerImport.consolidate.accountsReceivableLedger | %{$_.exchangeRate = 'H'}
$objects = $xml.LedgerImport.consolidate.accountsReceivableLedger
}elseif($xml.LedgerImport.consolidate.accountsPayableLedger){
$xml.LedgerImport.consolidate.accountsPayableLedger | %{$_.exchangeRate = 'S'}
$objects = $xml.LedgerImport.consolidate.accountsPayableLedger
}
if ($objects){
$objects | export-csv -LiteralPath $outpath -delimiter ";" -NoType -Encoding UTF8 -Append -Force
}
}

s.o.
Mal wieder never ending thread, me = out ... 🐟
Unser Buchhaltungsprogramm
So langsam müsstet ihr uns ein Gehalt zahlen 🙆... Sicher das du schon der richtige auf diesem Posten bist, wenn noch nicht mal das drin ist?! Oder willst du nur nicht vorhandenes Wissen vor deinen Vorgesetzten vortäuschen ...?Mal wieder never ending thread, me = out ... 🐟