nolle99
Goto Top

XML in CSV bat batch powershell

Als erstes mal frohe Ostern euch allen ;)
Nach dem Essen habe ich nun ein Problem das ich gern lösen würde. Ich habe eine XML Datei die im Excel mehrere Spalten hat. Die XML Datei will ich mit den Überschriften einfach in eine .csv Datei umgewandelt haben. Am liebsten mit einem batch oder powershell.

Kann mir jemand hier helfen

Content-ID: 335346

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

Ausgedruckt am: 24.11.2024 um 06:11 Uhr

132895
132895 16.04.2017 aktualisiert um 20:30:56 Uhr
Goto Top
Hi.
Ohne den XML-Inhalt wird das hier nichts, da musst du schon den XML-Inhalt posten. Wie sollen wir hier wissen was deine XML enthält und wie es in deine CSV übersetzt werden soll??!

Hier steht wie es beispielhaft geht:
XML in CSV umwandeln

Gruß
nolle99
nolle99 17.04.2017 um 06:42:27 Uhr
Goto Top
<?xml version="1.0" encoding="ISO-8859-1"?>  
<zr fileversion="1.0" datum="20170414T00:00:00" mitglied="562542" kz="IV" lfdnr="1409">  
  <rechnung paginier_nr="2017103402253" nr="R17-049997" datum="20170413T00:00:00">  
    <lieferant nr="807411" name="Firma" iln="4043523000009"/>  
    <ek_org>TX</ek_org>
    <summe>38.66</summe>
    <waehrung>EUR</waehrung>
    <skontierbar_betrag>38.66</skontierbar_betrag>
    <skonto_betrag>1.55</skonto_betrag>
    <nettowarenwert>32.49</nettowarenwert>
    <freifelder>
      <FF01></FF01>
      <FF02></FF02>
      <FF03></FF03>
      <FF04></FF04>
      <FF05></FF05>
    </freifelder>
    <mwst_liste>
      <mwst proz="19.00" netto="32.49" betrag="6.17"/>  
    </mwst_liste>
    <positionen>
      <position nr="000001">  
        <lieferschein>L17-049997</lieferschein>
        <bestellung>918405</bestellung>
        <auftrag>A17-523263</auftrag>
        <lfr_art_nr>906205</lfr_art_nr>
        <ean>4333523390338</ean>
        <text>softshell jacket*</text>
        <summe>32.49</summe>
        <menge>1.00</menge>
        <einheit>PCE</einheit>
        <preis>32.49</preis>
        <mwst>19.00</mwst>
      </position>
    </positionen>
  </rechnung>
</zr>

Das ist der Inhalt der XML nur eben ein paar Datensätze länger. Ich brauche einfach genau die gleiche Angaben nur eben in einer csv Datei.
132895
132895 17.04.2017 aktualisiert um 09:26:31 Uhr
Goto Top
brauche einfach genau die gleiche Angaben nur eben in einer csv Datei.
Und wie ?? Du scheinst nicht zu verstehen das sich das in X Varianten in eine CSV pressen lässt !!!! Sollen wir uns das nun auch wieder aus den Fingern saugen ??
Für jede Rechnung nur eine einzige Zeile, oder für jede Position der Rechnung (wenn es mehrere sind) jeweils eine extra Zeile oder in einer Zeile mit Trenner getrennt, usw?? Hier fehlen einfach zu viele Informationen von deiner Seite face-sad
Das ist der Inhalt der XML nur eben ein paar Datensätze länger
Was ist länger ? Welche Tags kommen mehrfach vor, die Rechnungs Tags ?

Lass dir doch nicht alles aus der Nase ziehen bitte. Danke!
nolle99
nolle99 17.04.2017 um 12:37:01 Uhr
Goto Top
Erstmal vielen Dank für deine Geduld und deine Hilfe ;)

hier mal eine fertige csv wie ich mir diese vorstelle:
fileversion;datum;mitglied;kz;lfdnr;paginier_nr;nr;datum2;nr3;name;iln;ek_org;summe;waehrung;skontierbar_betrag;skonto_betrag;nettowarenwert;FF01;FF02;FF03;FF04;FF05;proz;netto;betrag;nr4;lieferschein;bestellung;auftrag;lfr_art_nr;ean;text;summe5;menge;einheit;preis;mwst
1;20170414T00:00:00;562542;IV;1409;2017103402253;R17-049997;20170413T00:00:00;807411;Firma;4043523000009;TX;38,66;EUR;38,66;1,55;32,49;;;;;;19;32,49;6,17;1;L17-049997;918405;A17-523263;906205;4333523390338;softshell jacket*;32,49;1;PCE;32,49;19

hilft das?

Ich habe mir die XML im Excel aufgemacht ;) und exportiert.
132895
132895 17.04.2017 aktualisiert um 15:23:30 Uhr
Goto Top
Schön, aber das beantwortet nicht meine eigentliche Frage ob deine Rechnungen mehrere Positionen haben und ob für jede Position eine eigene Zeile mit den bereits bestehenden Daten der Rechnung generiert werden soll, das ist das was ich eigentlich wissen wollte.

$in = 'D:\data.xml'  
$out = 'D:\data.csv'  
$xml = new-Object XML; $xml.Load($in)
$xml.zr.rechnung | %{
    $data = [ordered]@{}
    $_.ParentNode.Attributes | %{$data.($_.Name) = $_.'#text'}  
    $_.SelectNodes('//*[not(*)]') | ?{$_.ParentNode.Name -notin @('position','positionen')} | %{if($_.HasAttributes){$_.Attributes | %{$data.($_.Name) = $_.'#text'}}else{$data.($_.LocalName) = $_.innerText}}  
    $_.positionen.position | %{
        $data.pos_nr = $_.nr
        $data.lieferschein = $_.lieferschein
        $data.bestellung = $_.bestellung
        $data.auftrag = $_.auftrag
        $data.lfr_art_nr = $_.lfr_art_nr
        $data.ean = $_.ean
        $data.text = $_.text
        $data.art_summe = $_.summe
        $data.menge = $_.menge
        $data.einheit = $_.einheit
        $data.preis = $_.preis
        $data.art_mwst = $_.mwst
        [pscustomobject] $data
    }
} | export-csv $out -Delimiter ";" -NoType -Encoding UTF8  
nolle99
nolle99 17.04.2017 um 19:47:34 Uhr
Goto Top
genial das klappt super. Nur einen Fehler gibt es noch. Die Komma Werte wie Preis werden jetzt mit Punkten 32.49 gespeichert face-sad
132895
132895 17.04.2017 aktualisiert um 20:35:29 Uhr
Goto Top
Deine Ausgangsdaten haben auch überall nur Punkte als Dezimaltrenner! Es wird alles so übernommen wie es in der Ursprungsdatei steht.
Wenn du Komma's willst ersetze sie einfach mit einem "Replace" face-wink das sollte nun wirklich jeder selbst hinbekommen, ein bisschen darfst du ja gerne selbst dazusteuern.
nolle99
nolle99 18.04.2017 um 05:38:17 Uhr
Goto Top
Ist mir jetzt nicht aufgefallen. Ich dachte nicht das Excel das umwandelt beim import :D
132895
132895 18.04.2017 um 09:00:19 Uhr
Goto Top
Na dann Haken dran und feddich.