freshman2017
Goto Top

Batch - TXT zu XML konvertieren

Guten Tag,

ich bin gerade dabei zu versuchen, eine TXT mit einer Bestellung in eine XML umzuwandeln. Im ersten Step bin ich auch gut voran gekommen.

Dabei nutze ich die Batch (mit einer TXT-Datei mit Variabeln), um eine einfache .XML Datei zu erstellen:

Export-TXT-Datei mit Variabeln:

1.0;UTF-8;12345;2020-09-25;Shipping;Max Muster;Beispielstraße 123;Musterstadt;Muster-Bundesland;12345;Musterland;

Batch-Skript:

@echo off

set "source=C:\Users\User-01\Desktop\export.txt"  

for /f "usebackq tokens=1,2,3,4,5,6,7,8,9,10,11,* delims=;" %%a in ("%source%") do set "xml version=%%a"  
for /f "usebackq tokens=1,2,3,4,5,6,7,8,9,10,11,* delims=;" %%a in ("%source%") do set "encoding=%%b"  
for /f "usebackq tokens=1,2,3,4,5,6,7,8,9,10,11,* delims=;" %%a in ("%source%") do set "PurchaseOrderNumber=%%c"  
for /f "usebackq tokens=1,2,3,4,5,6,7,8,9,10,11,* delims=;" %%a in ("%source%") do set "OrderDate=%%d"  
for /f "usebackq tokens=1,2,3,4,5,6,7,8,9,10,11,* delims=;" %%a in ("%source%") do set "Address Type=%%e"  
for /f "usebackq tokens=1,2,3,4,5,6,7,8,9,10,11,* delims=;" %%a in ("%source%") do set "Name=%%f"  
for /f "usebackq tokens=1,2,3,4,5,6,7,8,9,10,11,* delims=;" %%a in ("%source%") do set "Street=%%g"  
for /f "usebackq tokens=1,2,3,4,5,6,7,8,9,10,11,* delims=;" %%a in ("%source%") do set "City=%%h"  
for /f "usebackq tokens=1,2,3,4,5,6,7,8,9,10,11,* delims=;" %%a in ("%source%") do set "State=%%i"  
for /f "usebackq tokens=1,2,3,4,5,6,7,8,9,10,11,* delims=;" %%a in ("%source%") do set "Zip=%%j"  
for /f "usebackq tokens=1,2,3,4,5,6,7,8,9,10,11,* delims=;" %%a in ("%source%") do set "Country=%%k"  

(
echo ^<?xml version="%xml version%" encoding="%encoding%"?^>  
echo ^<PurchaseOrder PurchaseOrderNumber="%PurchaseOrderNumber%" OrderDate="%OrderDate%"^>  
echo ^<Address Type="%Address Type%"^>  
echo ^<Name^>%Name%^</Name^>
echo ^<Street^>%Street%^</Street^>
echo ^<City^>%City%^</City^>
echo ^<State^>%State%^</State^>
echo ^<Zip^>%Zip%^</Zip^>
echo ^<Country^>%Country%^</Country^>
echo ^</Address^>
echo ^</PurchaseOrder^> 
) > testaxample.xml

Erstellte XML:

<?xml version="1.0" encoding="UTF-8"?>  
<PurchaseOrder PurchaseOrderNumber="12345" OrderDate="2020-09-25">  
<Address Type="Shipping">  
<Name>Max Muster</Name>
<Street>Beispielstraße 123</Street>
<City>Musterstadt</City>
<State>Muster-Bundesland</State>
<Zip>12345</Zip>
<Country>Musterland</Country>
</Address>
</PurchaseOrder> 

Jetzt kommt allerdings die Herausforderung, an der ich gerade verzweifle. In die XML sollen nun noch mehrere (je nach dem, wie viele Artikelnummern sich in der Export-TXT befinden) "Items":

1.0;UTF-8;12345;2020-09-25;Shipping;Max Muster;Beispielstraße 123;Musterstadt;Muster-Bundesland;12345;Musterland;123456;Beispielartikel;1;149.95;Beispielkommentar;1234567;Beispielartikel-1;5;119.95;Beispielkommentar-1;

Gewünschte XML mit mehreren "Items" (je nach dem, wie viele Artikelnummern sich in der Export-TXT befinden):

<?xml version="1.0" encoding="UTF-8"?>  
<PurchaseOrder PurchaseOrderNumber="12345" OrderDate="2020-09-25">  
<Address Type="Shipping">  
<Name>Max Muster</Name>
<Street>Beispielstraße 123</Street>
<City>Musterstadt</City>
<State>Muster-Bundesland</State>
<Zip>12345</Zip>
<Country>Musterland</Country>
</Address>
<Items>
<Item PartNumber="123456">  
<ProductName>Beispielartikel</ProductName>
<Quantity>1</Quantity>
<Price>149.95</Price>
<Comment>Beispielkommentar</Comment>
</Item>
<Item PartNumber="1234567">  
<ProductName>Beispielartikel-1</ProductName>
<Quantity>5</Quantity>
<Price>119.95</Price>
<Comment>Beispielkommentar-1</Comment>
</Item>
</Items>
</PurchaseOrder> 


Jemand eine Idee, wie ich das umsetzen kann?

Content-ID: 607642

Url: https://administrator.de/forum/batch-txt-zu-xml-konvertieren-607642.html

Ausgedruckt am: 22.12.2024 um 16:12 Uhr

erikro
erikro 25.09.2020 um 16:13:34 Uhr
Goto Top
Moin,

Zitat von @freshman2017:
ich bin gerade dabei zu versuchen, eine TXT mit einer Bestellung in eine XML umzuwandeln. Im ersten Step bin ich auch gut voran gekommen.

Dabei nutze ich die Batch (mit einer TXT-Datei mit Variabeln), um eine einfache .XML Datei zu erstellen:

Warum? Batch is a pain in the a.

Jemand eine Idee, wie ich das umsetzen kann?**

Ja, mit der Powershell:
https://www.langlitz-it.de/?p=1297

Liebe Grüße

Erik
145916
Lösung 145916 25.09.2020 aktualisiert um 16:32:59 Uhr
Goto Top
Joa, mit Powershell würdest du es dir so viel einfacher machen, aber bei ihm scheint es ja wohl nie mal Klick zu machen, kommt jedes mal wieder mit dem 80er Batch Gegrätsche ... 🐟
Export-TXT-Datei mit Variabeln:
Wer sich so ein Export-Format ausdenkt hat echt einen an der Waffel face-big-smile.
$file = 'D:\orders.txt'  
$ausgabeordner = 'D:\Ausgabe'  

gc $file | %{
    $cols = $_.split(";")  
    [xml]$xml = @"  
<?xml version=`"$($cols)`" encoding=`"$($cols[1])`"?>  
<PurchaseOrder PurchaseOrderNumber="$($cols[2])" OrderDate="$($cols[3])">  
    <Address Type="$($cols[4])">  
        <Name>$($cols[5])</Name>
        <Street>$($cols[6])</Street>
        <City>$($cols[7])</City>
        <State>$($cols[8])</State>
        <Zip>$($cols[9])</Zip>
        <Country>$($cols[10])</Country>
    </Address>
    <Items/>
</PurchaseOrder>
"@  
    $itemsnode = $xml.SelectSingleNode("/PurchaseOrder/Items")  
    0..((($cols.Count - 11)/5)-1) | %{
        $index = 11+($_*5)
        $itm = $xml.CreateElement("Item")  
        $itm.SetAttribute("PartNumber",$cols[$index])  

        $node = $Xml.CreateElement("ProductName")  
        $node.innerText = $cols[$index+1]
        [void]$itm.AppendChild($node)
        $node = $Xml.CreateElement("Quantity")  
        $node.innerText = $cols[$index+2]
        [void]$itm.AppendChild($node)
        $node = $Xml.CreateElement("Price")  
        $node.innerText = $cols[$index+3]
        [void]$itm.AppendChild($node)
        $node = $Xml.CreateElement("Comment")  
        $node.innerText = $cols[$index+4]
        [void]$itm.AppendChild($node)
        [void]$itemsnode.AppendChild($itm)
    }
    $xml.Save((join-path $ausgabeordner "Order_$($cols[2]).xml"))  
}
Feierabend.
freshman2017
freshman2017 25.09.2020 um 17:02:39 Uhr
Goto Top
Zitat von @145916:

Joa, mit Powershell würdest du es dir so viel einfacher machen, aber bei ihm scheint es ja wohl nie mal Klick zu machen, kommt jedes mal wieder mit dem 80er Batch Gegrätsche ... 🐟
Export-TXT-Datei mit Variabeln:
Wer sich so ein Export-Format ausdenkt hat echt einen an der Waffel face-big-smile.
> $file = 'D:\orders.txt'  
> $ausgabeordner = 'D:\Ausgabe'  
> 
> gc $file | %{
>     $cols = $_.split(";")  
>     [xml]$xml = @"  
> <?xml version=`"$($cols)`" encoding=`"$($cols[1])`"?>  
> <PurchaseOrder PurchaseOrderNumber="$($cols[2])" OrderDate="$($cols[3])">  
>     <Address Type="$($cols[4])">  
>         <Name>$($cols[5])</Name>
>         <Street>$($cols[6])</Street>
>         <City>$($cols[7])</City>
>         <State>$($cols[8])</State>
>         <Zip>$($cols[9])</Zip>
>         <Country>$($cols[10])</Country>
>     </Address>
>     <Items/>
> </PurchaseOrder>
> "@  
>     $itemsnode = $xml.SelectSingleNode("/PurchaseOrder/Items")  
>     0..((($cols.Count - 11)/5)-1) | %{
>         $index = 11+($_*5)
>         $itm = $xml.CreateElement("Item")  
>         $itm.SetAttribute("PartNumber",$cols[$index])  
> 
>         $node = $Xml.CreateElement("ProductName")  
>         $node.innerText = $cols[$index+1]
>         [void]$itm.AppendChild($node)
>         $node = $Xml.CreateElement("Quantity")  
>         $node.innerText = $cols[$index+2]
>         [void]$itm.AppendChild($node)
>         $node = $Xml.CreateElement("Price")  
>         $node.innerText = $cols[$index+3]
>         [void]$itm.AppendChild($node)
>         $node = $Xml.CreateElement("Comment")  
>         $node.innerText = $cols[$index+4]
>         [void]$itm.AppendChild($node)
>         [void]$itemsnode.AppendChild($itm)
>     }
>     $xml.Save((join-path $ausgabeordner "Order_$($cols[2]).xml"))  
> }
> 
Feierabend.


Moin,

mit Powershell klappt das ja richtig gut, und wenn ich mir das so anschaue, ist es verständlicher.

Ich habe jetzt gesehen, dass er aus bspw. dem "ß" folgendes macht: "ß" - wie kann ich hier die Formatierung einstellen?
145916
Lösung 145916 25.09.2020 aktualisiert um 17:18:24 Uhr
Goto Top
Ich habe jetzt gesehen, dass er aus bspw. dem "ß" folgendes macht: "ß" - wie kann ich hier die Formatierung einstellen?
Bei Get-Content (gc) in Zeile 4 das Encoding deiner Textdatei ensprechend der Kodierung deiner Textdatei anpassen.

Bsp :
gc $file -Encoding Default | %{
Das "Default" entspricht dem Default Format deiner Windows Installation (bei deutschem Windows ANSI CP1252). Mögliche Enumerationswerte zeigt dir die IntelliSense UTF8, UTF32 Unicode usw..
freshman2017
freshman2017 26.09.2020 um 22:43:13 Uhr
Goto Top
Zitat von @145916:

Ich habe jetzt gesehen, dass er aus bspw. dem "ß" folgendes macht: "ß" - wie kann ich hier die Formatierung einstellen?
Bei Get-Content (gc) in Zeile 4 das Encoding deiner Textdatei ensprechend der Kodierung deiner Textdatei anpassen.

Bsp :
> gc $file -Encoding Default | %{
> 
Das "Default" entspricht dem Default Format deiner Windows Installation (bei deutschem Windows ANSI CP1252). Mögliche Enumerationswerte zeigt dir die IntelliSense UTF8, UTF32 Unicode usw..

Guten Abend eaglefinder,

vielen lieben Dank für die Hilfe, ich habe es heute Abend mal durchgetestet und sogar auch erweitert bekommen, sodass unter den Artikel noch weitere Angaben vorhanden sind.

Kannst Du mir noch sagen, wie ich das ganze ggf. in eine bestehende Batch einbauen kann á la:

 powershell -Executionpolicy ByPass -Command^