Powershell: CSV zu XML
Hallo zusammen,
ich hab das folgendes Problem:
Ich möchte gerne aus einer CSV Datei (dort sind bestände drin) gerne eine XML Datei Generieren.. Grundsätzlich ja nicht das Problem, allerdings macht mir das Format der XML zu schaffen..
Ich würde das ganze am liebsten in Powershell umsetzen.
Das Schema sieht so aus:
created würde einfach immer nur das Aktuelle Datum / zeit sein, der Rest wie MerchantVariantID und MerchantVariantID wären in der CSV zu finden.
die xsd dazu hätte ich auch. Nur reichen meine einfachen Kenntnisse in PowerShell und kaum Kenntnisse in XML nicht aus.
Ich hoffe jemand kann mir hierbei weiterhelfen.
ich hab das folgendes Problem:
Ich möchte gerne aus einer CSV Datei (dort sind bestände drin) gerne eine XML Datei Generieren.. Grundsätzlich ja nicht das Problem, allerdings macht mir das Format der XML zu schaffen..
Ich würde das ganze am liebsten in Powershell umsetzen.
Das Schema sieht so aus:
<?xml version="1.0" encoding="UTF-8"?>
<MessageList
xmlns="http://schema.limango.de"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://schema.limango.de
http://schema.limango.de/merchant/messagelist.xsd"
created="2019-01-15T15:52:01+00:00"
version="1.0">
<Message type="stock-amount">
<MerchantVariantID>sss-444-44</MerchantVariantID>
<Amount>12345</Amount>
</Message>
</MessageList>
created würde einfach immer nur das Aktuelle Datum / zeit sein, der Rest wie MerchantVariantID und MerchantVariantID wären in der CSV zu finden.
die xsd dazu hätte ich auch. Nur reichen meine einfachen Kenntnisse in PowerShell und kaum Kenntnisse in XML nicht aus.
Ich hoffe jemand kann mir hierbei weiterhelfen.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 617237
Url: https://administrator.de/contentid/617237
Ausgedruckt am: 24.11.2024 um 10:11 Uhr
7 Kommentare
Neuester Kommentar
Servus, willkommen auf Administrator.de!
sieht das für den obigen Code so aus:
Grüße Uwe
Nur wie bekomme ich das geregelt ?
Sofern der Aufbau der CSV so aussieht"MerchantVariantID";"Amount"
"sss-444-44";"100.12"
"sss-555-44";"100.55"
param(
[string]$folder,
[string]$delimiter = ";"
)
# Alle CSV-Dateien des Ordners durchlaufen
gci $folder -Filter "*.csv" | %{
$newname = $_.DirectoryName + "\" + $_.BaseName + ".xml"
write-host "Konvertiere '$($_.Fullname)' in '$newname'." -ForegroundColor Green
# importiere CSV-Datei als Objekt
$csv = import-csv $_.Fullname -Delimiter ";"
# Spaltennamen der CSV-Datei extrahieren
$cols = $csv | gm -MemberType NoteProperty | select -ExpandProperty Name
# erzeuge neues XML-Dokument
$xml = New-Object XML
# XML Grundgerüst laden
$xml.LoadXml('<?xml version="1.0" encoding="utf-8"?><MessageList xmlns="http://schema.limango.de" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schema.limango.de http://schema.limango.de/merchant/messagelist.xsd" created="" version="1.0" />')
# Zeit im 'created' Attribut des Document-Root setzen
$xml.DocumentElement.created = [string](get-date -f s)
# für jede Zeile der CSV-Datei ...
foreach($line in $csv){
# erzeuge ein neues Message-Element mit dem Standard-Namespace
$row = $xml.CreateElement('Message','http://schema.limango.de')
# füge dem Message Element ein Attribut hinzu
$row.SetAttribute('type','stock-amount')
# für jede Spalte der Zeile erstelle ein neues Element mit dem Namen der Spalte und dem Inhalt der aktuellen Zeile
$cols | %{
$col = $xml.CreateElement($_,'http://schema.limango.de')
$col.InnerText = $line.($_)
$row.AppendChild($col) | out-null
}
# füge das Message-Element im Root-Knoten ein
$xml.DocumentElement.AppendChild($row) | out-null
}
# Speichere die neue XML-Datei
$xml.Save($newname)
}
Das ist kein Problem, deswegen ist es ja XML, dem ist die Reihenfolge egal Hauptsache der Name des Knotens stimmt und folgt den Bestimmungen der Schemadefinition, du kannst die Reihenfolge aber auch selbst bestimmen indem du die Spaltennamen welche
in dieser Zeile automatisch extrahiert werden sortierst wenn du unbedingt willst
Wenn du sowieso nur zwei Spalten hast könntest du auch auf die automatische Extrahierung der Spaltennamen verzichten, das war ja in dem Skript nur dafür vorgesehen daß es universell anwendbar ist.
in dieser Zeile automatisch extrahiert werden sortierst wenn du unbedingt willst
$cols = $csv | gm -MemberType NoteProperty | sort Name -Descending | select -ExpandProperty Name