rb03.de
Goto Top

Powershell XML umwandeln

Hallo,

bisher habe ich mich mehr oder weniger erfolgreich durch sämtliche xml Foren gelesen komme aber jetzt leider an einen Punkt an dem es seit mehreren Wochen nicht weiter geht. Ich möchte zum Teil sehr große XML Dateien in entweder csv oder txt umwandel, ich habe dazu das nachfolgende Script geschrieben welches mir auch jeden Knoten in eine Zeile schreibt, was allerdings fehlt und wo ich nun nicht weiter kommen: Ich hätte gerne nach jeden Tag einen Trenner Semikolon oder Komma.

Content-Key: 640947

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

Printed on: April 24, 2024 at 13:04 o'clock

Member: NordicMike
NordicMike Jan 15, 2021 at 09:41:33 (UTC)
Goto Top
Du kannst mit Text oder eine Tabelle nur zwei Dimensionen abdecken. Wie soll es sich verhalten, wenn du mehr als zwei mal verzweigst?
Member: rb03.de
rb03.de Jan 15, 2021 at 10:42:46 (UTC)
Goto Top
Zwei Dimensionen sind ausreichend, ich öffne aktuell die XML Datei mit Excel, nur möchte ich das ganze automatisieren.
In Excel habe ich z.B als Spaltenbeschriftung das xml Tag.
Mitglied: 147323
147323 Jan 19, 2021 updated at 11:58:09 (UTC)
Goto Top
Ich hätte gerne nach jeden Tag einen Trenner Semikolon oder Komma.
$in = 'C:\Daten\99.xml'  
$out = 'C:\Daten\99.txt'  
$XmlData = New-Object XML
$xmlData.Load($in)
$XmlData.document.BkToCstmrDbtCdtNtfctn.Ntfctn.Ntry.NtryDtls.TxDtls | %{"$($_.InnerText);"} | out-file $out -Encoding UTF8   
Gruß j.
Member: rb03.de
rb03.de Jan 20, 2021, updated at Jan 21, 2021 at 12:34:20 (UTC)
Goto Top
Hallo jokari,
vielen Dank für die Unterstützung!! Im Ergebnis habe ich nun nach jeder Zeile ein Semikolon, das freut mich aber ich wollte nach jedem Knoten
Mitglied: 147323
147323 Jan 20, 2021 updated at 14:09:40 (UTC)
Goto Top
Dann beschreibe besser was du willst dann erhältst du auch passende Antworten... Hier kennt keiner den Inhalt der XML.
Einfach als Beispiel IST und SOLL posten dann kommt hier auch jeder mit.

Wie man XML zu CSV wandelt kannst du auch schon hier nachlesen
XML in CSV umwandeln
Member: rb03.de
rb03.de Jan 21, 2021, updated at Feb 03, 2021 at 06:02:47 (UTC)
Goto Top
Ich versuche es:
So sieht es aus wenn ich die Xml Datei mit mieinem Script bearbeite:

02-999999Beleg 12349876DE00080110020000000000000001444912865.2465.42PMNT+99909+K9.18GELTCRED9.18TECREDMax MusterDEMusterstrasse 2699999 TeststadtD999376016Test FirmaDE99ZZZ00000099999BIC Vertragskonto 9999999 RG 1234567/0BIC

So soll es aussehen:
02-999999;Beleg 12349876;DE0008011002;000000000000000;1444912865.2465.42;PMNTIDDT;UPDD;NRTI+;9.18;E
Mitglied: 147323
147323 Jan 21, 2021 updated at 07:18:39 (UTC)
Goto Top
Das ist keine valide XML Datei .... So kann man damit nichts anfangen.
Member: NordicMike
NordicMike Jan 21, 2021 updated at 07:57:30 (UTC)
Goto Top
Das ist keine valide XML Datei

Natürlich nicht, er hat ja auch nur die Ausgaben gepostet, nicht die Original XML Datei.

Aber mit ein bisschen Googeln und lernen, was der Befehl macht, kommt er schon drauf, wie man das macht.
Mitglied: 147323
147323 Jan 21, 2021 updated at 08:49:07 (UTC)
Goto Top
Den Link oben aus dem hiesigen Forum lesen wäre ja schon ein Anfang ... Aber dafür hat's wohl beim TO offensichtlich nicht gereicht, da stehts ja eigentlich schon auf dem Serviertablett.
Member: rb03.de
rb03.de Jan 21, 2021 at 09:31:31 (UTC)
Goto Top
Der Link ist gut, allerdings funktioniert eine Erstellung in dieser Art nur bis 4 MB ,alles was größer ist wird unvollständig in die CSV Datei geschrieben. Die beste Lösung war bisher die oben beschriebene mit innertext, allerdings ist diese auch unbrauchbar wenn ein Trennzeichen fehlt da ich die Daten noch weiterbearbeiten möchte.
Die original XML Datei kann ich leider nicht zur Verfügung stellen, diese enthält Kundendaten. Es geht mir auch nur um das Trennzeichen an der richtigen Stelle.
Mitglied: 147323
147323 Jan 21, 2021 updated at 10:18:36 (UTC)
Goto Top
Zitat von @rb03.de:

Der Link ist gut, allerdings funktioniert eine Erstellung in dieser Art nur bis 4 MB ,alles was größer ist wird unvollständig in die CSV Datei geschrieben.
Nö das ist Blödsinn! Habe ich gerade mal probiert geht problemlos auch mit 200MB großen XMLs, scheint deine Mühle zu schwach auf der Brust zu sein oder du hast einen Fehler eingebaut.
Mitglied: 147323
147323 Jan 21, 2021 updated at 16:40:49 (UTC)
Goto Top
Also dann hier nochmal zum einfachen Nachlesen und Nachmachen und verstehen ...

Beispiel XML
<?xml version="1.0" encoding="utf-8"?>  
<root>
	<Items>
		<Item>
			<Vorname>Max</Vorname>
			<Nachname>Muster</Nachname>
			<Adresse>Musterstr. 6</Adresse>
			<PLZ>99999</PLZ>
			<Ort>Musterhausen</Ort>
		</Item>
		<Item>
			<Vorname>Maria</Vorname>
			<Nachname>Musterfrau</Nachname>
			<Adresse>Musterstr. 99</Adresse>
			<PLZ>99999</PLZ>
			<Ort>Musterhausen</Ort>
		</Item>
	</Items>
</root>

Code
$in = 'A:\test.xml'  
$out = 'A:\test.csv'  
$xml = New-Object XML
$xml.Load($in)
$xml.root.Items.Item | export-csv $out -Delimiter ";" -NoType -Encoding UTF8  
Ergebnis nach Export in CSV
"Vorname";"Nachname";"Adresse";"PLZ";"Ort"  
"Max";"Muster";"Musterstr. 6";"99999";"Musterhausen"  
"Maria";"Musterfrau";"Musterstr. 99";"99999";"Musterhausen"  
Also, works as expected!

Jetzt bist du dran.
Ich bin jetzt raus.
Member: rb03.de
rb03.de Jan 22, 2021 at 11:34:15 (UTC)
Goto Top
Hallo jokari, vielen Dank für Deinen Einsatz.
Ja das man so ein Trennzeichen setzen kann ist mir klar, aber ich benutze nun mal "InnerText" weil ich eine Menge Daten damit auslese, die ich gerne weiterverarbeiten würde.
Aber auch vielen Dank für den Testaufbau, ich hoffe damit kommen wir zum Ziel.
Wenn ich also Deinen Code auf "InnerText" anpasse bekomme ich eben ein Ergebnis ohne Trennzeichen.
Evtl. wäre es besser wenn ich" InnerText" durch einen anderen Befehl ersetze?

$in = 'C:\Daten\new-file.xml'  
$out = 'C:\Daten\190.txt'  
$xml = New-Object XML
$xml.Load($in)
$xml.root.InnerText | Out-File $out -Encoding UTF8

Ergebnis nach Export in CSV
MaxMusterMusterstr. 699999MusterhausenMariaMusterfrauMusterstr. 9999999Musterhausen
Mitglied: 147323
147323 Jan 22, 2021 updated at 11:37:50 (UTC)
Goto Top
Du brauchst und darfst für das obige Beispiel das InnerText nicht benutzen das zerstört in diesem Fall die schon vorhandene Objektstruktur und die ist für den Export via export-csv zwingend nötig, also weglassen und schon läuft das !
Member: rb03.de
rb03.de Jan 22, 2021 at 12:53:43 (UTC)
Goto Top
Vielen Dank, damit weiß ich diese Lösung nicht weiter verfolgen brauche.
Member: NordicMike
NordicMike Jan 22, 2021 at 13:20:00 (UTC)
Goto Top
Hast du eine einzige Anleitung zu einem dieser Befehlssätze gelesen?
Member: rb03.de
rb03.de Jan 22, 2021 at 14:22:09 (UTC)
Goto Top
Google Dir die Antwort!
Member: NordicMike
NordicMike Jan 25, 2021 at 06:46:34 (UTC)
Goto Top
Google sagt: Nein. Dann habe ich nochmal gegoogelt, dann war die Antwort: 42