ellondellon
Goto Top

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

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

3803037559
Lösung 3803037559 06.09.2022 aktualisiert um 16:42:48 Uhr
Goto Top
Moin.
Gibbet hier doch en masse, wie kann man da noch auf den Schlauch stehen face-wink
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  
} 
Cheers
certguy
ellondellon
ellondellon 06.09.2022 um 16:23:17 Uhr
Goto Top
Hi certguy,

danke für die schnelle Antwort und die Hilfe. Ja die anderen Beiträge habe ich auch gefunden, habe es aber nicht geschafft das die einzelnen xml in die csv geschrieben werden. Ich bin noch nicht so versiert in Powershell, bin hier noch am lernen und üben.
Leider bekomme ich bei deinem scriipt folgenden Fehler:

Get-Content : Das Argument kann nicht an den Parameter "Path" gebunden werden, da es NULL ist.
In Zeile:2 Zeichen:24

back-to-top([xml](Get-Content $_.Fullname)).LedgerImport.consolidate.account ...

back-to-top~~~~~~~~~~~

+ CategoryInfo : InvalidData: (face-smile [Get-Content], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.GetContentC
ommand

Grüße
Sebastian
3803037559
3803037559 06.09.2022 aktualisiert um 16:31:05 Uhr
Goto Top
Sorry Tippfehler muss natürlich $file.Fullname heißen, ist behoben.
Looser27
Looser27 06.09.2022 um 16:29:44 Uhr
Goto Top
Ich glaube da fehlt ein -path

... in Get-ChildItem -path "D:\Ordner" -...  
ellondellon
ellondellon 06.09.2022 um 16:50:23 Uhr
Goto Top
Hi certguy,

da hätte ich auch selber drauf kommen müssen. Tausend Dank für deine Hilfe, funktioniert super. Ich habe da viel zu kompliziert gedacht.

Beste Grüße aus Oranienburg
Sebastian
aqui
aqui 06.09.2022 aktualisiert um 18:10:08 Uhr
Goto Top
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!! 😉
ellondellon
ellondellon 07.09.2022 um 12:32:29 Uhr
Goto Top
Hi,

sorry für die fehlenden Code tags.
Jetzt habe ich aber nochmal eine Frage. Der Code hat super funktioniert, nun habe ich allerdings eine Kleinigkeit übersehen. Ich habe zwei Arten von xml Dateien, einmal die mit ,,accountsPayableLedger"und einmal mit ,,accountsReceivableLedger"
Für die ,,accountsPayableLedger" funktioniert das script super, und wenn ich es umstelle dann auch für die receivables, aber besteht auch die Möglichkeit es in einem Script zusammenzufassen, das die Payables und die Receivables in eine csv geschrieben werden?
Sorry für die neue Frage, aber ich ich bin noch nicht so fit in Powershell...

Beste Dank

Sebastian

Anbei noch die beiden Demo XML

für receivable

<?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="121.50" consolidatedDate="2022-06-07" consolidatedInvoiceId="470985" consolidatedCurrencyCode="EUR">
<accountsReceivableLedger>
<date>2022-06-07</date>
<amount>59.50</amount>
<accountNo>8404</accountNo>
<costCategoryId>1</costCategoryId>
<tax>19.00</tax>
<currencyCode>EUR</currencyCode>
<invoiceId>470985</invoiceId>
<bookingText>Testikowsi - 470985</bookingText>
<partyId>46208</partyId>
<internalInvoiceId>470985</internalInvoiceId>
<exchangeRate>1.000000</exchangeRate>
<dueDate>2022-06-07</dueDate>
<bpAccountNo>46208</bpAccountNo>
<customerName>Testikowsi </customerName>
</accountsReceivableLedger>
<accountsReceivableLedger>
<date>2022-06-07</date>
<amount>62.00</amount>
<accountNo>8401</accountNo>
<costCategoryId>1</costCategoryId>
<tax>19.00</tax>
<currencyCode>EUR</currencyCode>
<invoiceId>470985</invoiceId>
<bookingText>Testikowsi - 470985</bookingText>
<partyId>46208</partyId>
<internalInvoiceId>470985</internalInvoiceId>
<exchangeRate>1.000000</exchangeRate>
<dueDate>2022-06-07</dueDate>
<bpAccountNo>46208</bpAccountNo>
<customerName>Testikowsi </customerName>
</accountsReceivableLedger>
</consolidate>
</LedgerImport>


und für payable


<?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="121.87" consolidatedDate="2022-06-08" consolidatedInvoiceId="964419092" consolidatedCurrencyCode="EUR">
<accountsPayableLedger>
<date>2022-06-08</date>
<amount>121.87</amount>
<accountNo>3401</accountNo>
<costCategoryId>1</costCategoryId>
<tax>19.00</tax>
<currencyCode>EUR</currencyCode>
<invoiceId>964419092</invoiceId>
<bookingText>Also Deutschland GmbH - 209439</bookingText>
<partyId>70202</partyId>
<internalInvoiceId>209439</internalInvoiceId>
<exchangeRate>1.000000</exchangeRate>
<dueDate>2022-07-08</dueDate>
<bpAccountNo>70202</bpAccountNo>
<supplierName>Also Deutschland GmbH</supplierName>
<supplierCity>Soest</supplierCity>
</accountsPayableLedger>
</consolidate>
</LedgerImport>
3803037559
Lösung 3803037559 07.09.2022, aktualisiert am 08.09.2022 um 10:27:58 Uhr
Goto Top
$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  
    }
} 
ellondellon
ellondellon 07.09.2022 um 13:20:02 Uhr
Goto Top
Danke Certguy für die schnelle und super kompetente Hilfe....
ellondellon
ellondellon 08.09.2022 um 09:30:18 Uhr
Goto Top
Vielen Dank nochmal für schnelle Hilfe, das Script funktioniert einwandfrei. Allerdings habe ich einen kleinen Denkfehler gemacht und brauche doch nochmal Hilfe, wobei ich mir nicht sicher bin ob das überhaupt realisierbar. Wie gesagt, ich stehe bei Powershell noch ganz am Anfang.

Ich habe ja wie oben schon beschrieben zwei typen von XML Dateien, einmal die Payable für Eingangsrechnungen und einmal receivable für Ausgangsrechnungen. Der Export Dieser Dateien in eine csv funktionieren Dank certguy super. Nur leider habe ich eine Sache übersehen. Unser Buchhaltungsprogramm erwartet in einer Spalte der csv Datei die Buchungsvorzeichen, sprich soll oder Haben, dargestellt als S oder H.
Meine Idee war nun, das ich mit einem Script die xml öffne, eine node in der xml welche ich nicht brauche in S oder H ändere.
Es handelt sich dabei um die Zeile
<exchangeRate>1.000000</exchangeRate>
hier müsste nur der Wert 1.000000 abgeändert werden in S und H. Und zwar bei Payable in S und bei receivable in H.

Anbei nochmal zwei Beispiel xml Dateien., Vielleicht hat ja einer die zündende Idee für mich.

Danke euch

Sebastian

für receivable

<?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="121.50" consolidatedDate="2022-06-07" consolidatedInvoiceId="470985" consolidatedCurrencyCode="EUR">  
<accountsReceivableLedger>
<date>2022-06-07</date>
<amount>59.50</amount>
<accountNo>8404</accountNo>
<costCategoryId>1</costCategoryId>
<tax>19.00</tax>
<currencyCode>EUR</currencyCode>
<invoiceId>470985</invoiceId>
<bookingText>Testikowsi - 470985</bookingText>
<partyId>46208</partyId>
<internalInvoiceId>470985</internalInvoiceId>
<exchangeRate>1.000000</exchangeRate>
<dueDate>2022-06-07</dueDate>
<bpAccountNo>46208</bpAccountNo>
<customerName>Testikowsi </customerName>
</accountsReceivableLedger>
<accountsReceivableLedger>
<date>2022-06-07</date>
<amount>62.00</amount>
<accountNo>8401</accountNo>
<costCategoryId>1</costCategoryId>
<tax>19.00</tax>
<currencyCode>EUR</currencyCode>
<invoiceId>470985</invoiceId>
<bookingText>Testikowsi - 470985</bookingText>
<partyId>46208</partyId>
<internalInvoiceId>470985</internalInvoiceId>
<exchangeRate>1.000000</exchangeRate>
<dueDate>2022-06-07</dueDate>
<bpAccountNo>46208</bpAccountNo>
<customerName>Testikowsi </customerName>
</accountsReceivableLedger>
</consolidate>
</LedgerImport>

und für payable


<?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="121.87" consolidatedDate="2022-06-08" consolidatedInvoiceId="964419092" consolidatedCurrencyCode="EUR">  
<accountsPayableLedger>
<date>2022-06-08</date>
<amount>121.87</amount>
<accountNo>3401</accountNo>
<costCategoryId>1</costCategoryId>
<tax>19.00</tax>
<currencyCode>EUR</currencyCode>
<invoiceId>964419092</invoiceId>
<bookingText>Also Deutschland GmbH - 209439</bookingText>
<partyId>70202</partyId>
<internalInvoiceId>209439</internalInvoiceId>
<exchangeRate>1.000000</exchangeRate>
<dueDate>2022-07-08</dueDate>
<bpAccountNo>70202</bpAccountNo>
<supplierName>Also Deutschland GmbH</supplierName>
<supplierCity>Soest</supplierCity>
</accountsPayableLedger>
</consolidate>
</LedgerImport>
3803037559
3803037559 08.09.2022 aktualisiert um 10:45:01 Uhr
Goto Top
s.o.

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 ... 🐟
ellondellon
ellondellon 08.09.2022 um 11:58:20 Uhr
Goto Top
Ob ich der richtige bin wage ich zu bezweifeln, da sich meine Kenntnisse im Bereich Powershell in Grenzen halten. Ich mache gerade ein Fernstudium Wirtschaftsinformatik, habe aber erst vor 6 Monaten angefangen, daher war ich hier auf der Suche nach Hilfe.
Wir haben halt das Problem, das wir die Daten die wir aus der WaWi erhalten nicht beim Exportieren schon so formatieren können, das es zu unsere BuHa Software Stotax passt. Leider ist auch eine Anpassung vom Hersteller nicht möglich, bzw. wird dieses vom Hersteller nicht gewollt. Daher versuchen wir uns jetzt mit dem Umweg über ein Script zu behelfen um unsere Büro papierloser zu gestalten, da durch die beiden Systeme Unmengen Papier produzieren.. Beide Systeme, zum einen unsere WaWi C-entron, als auch das Stotax sind seit Jahren im Betrieb, und es ist aus betrieblichen Gründen leider nicht möglich hier kurzfristig auf andere geeignetere Programme umzusteigen Zum Prahlen will ich das auf keinen Fall nutzen, das liegt mir wirklich fern. Hier wurde die Importschnittstelle schon von der Firma angepasst, und mit dem Code von Certguy funktioniert das wirklich super. Danke nochmal dafür.

@3803037559, danke für deine Hilfe und sorry das die Infos von meiner Seite etwas dünn waren. Dein Skript soll meinerseits keineswegs zum Prahlen genutzt werden. Das liegt mir wirklich fern, sorry wenn der Eindruck entstanden ist.

Grüße aus Berlin