compu2000
Goto Top

Powershell - Möglichkeit: XML zu CSV

Guten Abend aus dem Süden,

ich würde gerne über Powershell - Daten aus einer XML Datei in eine CSV konvertieren, hat da jemand schon Erfahrung?

Hierbei würde nachfolgende XML (aus Platzgründen habe ich die XML gekürzt "<ABL> sowie <Bestellung> haben immer den gleichen Aufbau") vorliegen:

<TransferFile>
KundenNummer>22932</KundenNummer>
<RueckmeldeDatum>2020-09-24T09:14:11+01:00</RueckmeldeDatum>
<Bestellungen>
<ABL>
</ABL>
<ABL>
</ABL>
<ABL>
</ABL>
<ABL>
</ABL>
<ABL>
<BelegNummer>12345</BelegNummer>
<Bestellreferenz>7213508</Bestellreferenz>
<Zustelldatum>24.08.2020</Zustelldatum>
<Spedtion>
<Name>Trans-O-Flex</Name>
<Referenznummer>338182</Referenznummer>
</Spedtion>
<image>
<imagename>000000114003438.TIF</imagename>
<content>
</content>
</image>
</ABL>
<ABL>
<BelegNummer>123456</BelegNummer>
<Bestellreferenz>72135084</Bestellreferenz>
<Zustelldatum>24.08.2020</Zustelldatum>
<Spedtion>
<Name>Trans-O-Flex</Name>
<Referenznummer>338182</Referenznummer>
</Spedtion>
<image>
<imagename>000000114003438.TIF</imagename>
<content>
</content>
</image>
</ABL>
<Bestellung>
<BelegNummer>54234567</BelegNummer>
<Bestellreferenz>7268105</Bestellreferenz>
<LieferDatum>2020-09-01T14:01:42+01:00</LieferDatum>
<Spedition>
<Name>Trans-O-Flex</Name>
<Referenznummer>401505</Referenznummer>
</Spedition>
<PDF>
<PdfDateiname>76543456pdf</PdfDateiname>
<content>
</content>
</PDF>
<Positionen>
<Position>
<PositionsNummer>1</PositionsNummer>
<PZN>xxx</PZN>
<ErsatzArtikel>false</ErsatzArtikel>
<Menge>6</Menge>
<Bezeichnung>xxx</Bezeichnung>
<Bestellreferenz/>
</Position>
</Positionen>
</Bestellung>
<Bestellung>
<BelegNummer>542345678</BelegNummer>
<Bestellreferenz>72681058</Bestellreferenz>
<LieferDatum>2020-09-01T14:01:42+01:00</LieferDatum>
<Spedition>
<Name>Trans-O-Flex</Name>
<Referenznummer>4015045</Referenznummer>
</Spedition>
<PDF>
<PdfDateiname>76543456pdf</PdfDateiname>
<content>
</content>
</PDF>
<Positionen>
<Position>
<PositionsNummer>1</PositionsNummer>
<PZN>xxx</PZN>
<ErsatzArtikel>false</ErsatzArtikel>
<Menge>6</Menge>
<Bezeichnung>xxx</Bezeichnung>
<Bestellreferenz/>
</Position>
</Positionen>
</Bestellung>
<Bestellung>
</Bestellung>
<Bestellung>
</Bestellung>
<Bestellung>
</Bestellung>
<Bestellung>
</Bestellung>
<Bestellung>
</Bestellung>
<Bestellung>
</Bestellung>
<Bestellung>
</Bestellung>
<Bestellung>
</Bestellung>
<Bestellung>
</Bestellung>
<Bestellung>
</Bestellung>
<Bestellung>
</Bestellung>
<Bestellung>
</Bestellung>
<Bestellung>
</Bestellung>
<Bestellung>
</Bestellung>
</Bestellungen>
</TransferFile>

Jetzt würde ich gerne aus allen "Blöcken":

Bsp.-<ABL>:

<ABL>
<BelegNummer>12345</BelegNummer>
<Bestellreferenz>7213508</Bestellreferenz>
<Zustelldatum>24.08.2020</Zustelldatum>
<Spedtion>
<Name>Trans-O-Flex</Name>
<Referenznummer>338182</Referenznummer>
</Spedtion>
<image>
<imagename>000000114003438.TIF</imagename>
<content>
</content>
</image>
</ABL>


sowie Bsp.-<Bestellung>:

<Bestellung>
<BelegNummer>54234567</BelegNummer>
<Bestellreferenz>7268105</Bestellreferenz>
<LieferDatum>2020-09-01T14:01:42+01:00</LieferDatum>
<Spedition>
<Name>Trans-O-Flex</Name>
<Referenznummer>401505</Referenznummer>
</Spedition>
<PDF>
<PdfDateiname>76543456pdf</PdfDateiname>
<content>
</content>
</PDF>
<Positionen>
<Position>
<PositionsNummer>1</PositionsNummer>
<PZN>xxx</PZN>
<ErsatzArtikel>false</ErsatzArtikel>
<Menge>6</Menge>
<Bezeichnung>xxx</Bezeichnung>
<Bestellreferenz/>
</Position>
</Positionen>
</Bestellung>

Daten in zwei CSVs zu schreiben. Gewünschter Aufbau der CSV wäre:

abl.csv

12345;7213508;24.08.2020;Trans-O-Flex;338182;
123456;72135084;24.08.2020;Trans-O-Flex;338182;

Erklärung: Bestellreferenz aus ABL;Belegnummer aus ABL;Zustelldatum aus ABL;Name Spedition aus ABL;Referenznummer Spedition aus ABL;

bestellung.csv

7268105;54234567;2020-09-01T14:01:42+01:00;Trans-O-Flex;401505;
72681058;542345678;2020-09-01T14:01:42+01:00;Trans-O-Flex;4015045;

Erklärung: Bestellreferenz aus Bestellung;Belegnummer aus Bestellung;Lieferdatum aus Bestellung;Name Spedition aus ABL;Referenznummer Spedition aus ABL;

Wie würde so etwas mit Powershell aussehen?

Content-Key: 609537

Url: https://administrator.de/contentid/609537

Ausgedruckt am: 29.03.2024 um 11:03 Uhr

Mitglied: 146189
146189 02.10.2020 aktualisiert um 19:36:50 Uhr
Goto Top
So => XML in CSV umwandeln

$ordner = 'D:\bestellungen'  
ls $ordner -File -Filter *.xml | %{
    $xml = New-Object XML
    $xml.Load($_.FullName)
    $xml.TransferFile.Bestellungen.ABL | select Belegnummer,Bestellreferenz,Zustelldatum,@{n='Spedition';e={$_.Spedition.Name}},@{n='Referenznummer Spedition';e={$_.Spedition.Referenznummer}} | export-csv (join-path $ordner "abl_$($_.Basename).csv") -Delimiter ";" -NoType -Encoding UTF8  
    $xml.TransferFile.Bestellungen.Bestellung | select Belegnummer,BestellReferenz,LieferDatum,@{n='Spedition';e={$_.Spedition.Name}},@{n='Referenznummer Spedition';e={$_.Spedition.Referenznummer}} | export-csv (join-path $ordner "bestellungen_$($_.Basename).csv") -Delimiter ";" -NoType -Encoding UTF8  
}
Mitglied: compu2000
compu2000 03.10.2020 um 00:55:58 Uhr
Goto Top
Zitat von @146189:

So => XML in CSV umwandeln

> $ordner = 'D:\bestellungen'  
> ls $ordner -File -Filter *.xml | %{
>     $xml = New-Object XML
>     $xml.Load($_.FullName)
>     $xml.TransferFile.Bestellungen.ABL | select Belegnummer,Bestellreferenz,Zustelldatum,@{n='Spedition';e={$_.Spedition.Name}},@{n='Referenznummer Spedition';e={$_.Spedition.Referenznummer}} | export-csv (join-path $ordner "abl_$($_.Basename).csv") -Delimiter ";" -NoType -Encoding UTF8  
>     $xml.TransferFile.Bestellungen.Bestellung | select Belegnummer,BestellReferenz,LieferDatum,@{n='Spedition';e={$_.Spedition.Name}},@{n='Referenznummer Spedition';e={$_.Spedition.Referenznummer}} | export-csv (join-path $ordner "bestellungen_$($_.Basename).csv") -Delimiter ";" -NoType -Encoding UTF8  
> }
> 

Sehr gut, vielen lieben Dank! Eine Frage habe dazu noch, wenn ich das ausführe, würde ich gerne als Abschlusszeichen ebenfalls ein Semikolon haben. Wie bekomme ich das hin?
Mitglied: 146189
Lösung 146189 03.10.2020 aktualisiert um 08:25:22 Uhr
Goto Top
$ordner = 'D:\bestellungen'  
ls $ordner -File -Filter *.xml | %{
    $xml = New-Object XML
    $xml.Load($_.FullName)
    ($xml.TransferFile.Bestellungen.ABL | select Belegnummer,Bestellreferenz,Zustelldatum,@{n='Spedition';e={$_.Spedition.Name}},@{n='Referenznummer Spedition';e={$_.Spedition.Referenznummer}} | ConvertTo-CSV -Delimiter ";" -NoType) -replace '$',';' | out-file (join-path $ordner "abl_$($_.Basename).csv") -Encoding UTF8  
    ($xml.TransferFile.Bestellungen.Bestellung | select Belegnummer,BestellReferenz,LieferDatum,@{n='Spedition';e={$_.Spedition.Name}},@{n='Referenznummer Spedition';e={$_.Spedition.Referenznummer}} | ConvertTo-CSV -Delimiter ";" -NoType) -replace '$',';' | out-file (join-path $ordner "bestellungen_$($_.Basename).csv") -Encoding UTF8  
}