Csv in Xml umwandeln
Hallo,
nach langer Zeit habe ich wieder eine Frage.
Ich bekomme eine csv-Datei, und um die weiter verarbeiten zu können, muss diese Datei mit einem Xslt-Transformer in das XML-Format umgewandelt werden.
Die csv-Datei sieht wie folgt aus:
Date "Time" "Service Point" Meter Number Channel Reading Unit
07.09.2015 00:15 48001006278 12345 Aggregate Active Export 1 kW
07.09.2015 00:30 48001006278 12345 Aggregate Active Export 2 kW
07.09.2015 00:45 48001006278 12345 Aggregate Active Export 3 kW
07.09.2015 01:00 48001006278 12345 Aggregate Active Export 4 kW
07.09.2015 01:15 48001006278 12345 Aggregate Active Export 5 kW
07.09.2015 01:30 48001006278 12345 Aggregate Active Export 6 kW
07.09.2015 01:45 48001006278 12345 Aggregate Active Export 7 kW
07.09.2015 02:00 48001006278 12345 Aggregate Active Export 8 kW
07.09.2015 00:15 48001006278 12345 Aggregate Active Import 1 kW
07.09.2015 00:30 48001006278 12345 Aggregate Active Import 2 kW
07.09.2015 00:45 48001006278 12345 Aggregate Active Import 3 kW
07.09.2015 01:00 48001006278 12345 Aggregate Active Import 4 kW
07.09.2015 01:15 48001006278 12345 Aggregate Active Import 5 kW
07.09.2015 01:30 48001006278 12345 Aggregate Active Import 6 kW
07.09.2015 01:45 48001006278 12345 Aggregate Active Import 7 kW
07.09.2015 02:00 48001006278 12345 Aggregate Active Import 8 kW
07.09.2015 00:15 12345678901 987654 Aggregate Active Export 1 kW
07.09.2015 00:30 12345678901 987654 Aggregate Active Export 2 kW
07.09.2015 00:45 12345678901 987654 Aggregate Active Export 3 kW
07.09.2015 01:00 12345678901 987654 Aggregate Active Export 4 kW
07.09.2015 01:15 12345678901 987654 Aggregate Active Export 5 kW
07.09.2015 01:30 12345678901 987654 Aggregate Active Export 6 kW
07.09.2015 01:45 12345678901 987654 Aggregate Active Export 7 kW
07.09.2015 02:00 12345678901 987654 Aggregate Active Export 8 kW
07.09.2015 00:15 12345678901 987654 Aggregate Active Import 1 kW
07.09.2015 00:30 12345678901 987654 Aggregate Active Import 2 kW
07.09.2015 00:45 12345678901 987654 Aggregate Active Import 3 kW
07.09.2015 01:00 12345678901 987654 Aggregate Active Import 4 kW
07.09.2015 01:15 12345678901 987654 Aggregate Active Import 5 kW
07.09.2015 01:30 12345678901 987654 Aggregate Active Import 6 kW
07.09.2015 01:45 12345678901 987654 Aggregate Active Import 7 kW
07.09.2015 02:00 12345678901 987654 Aggregate Active Import 8 kW
Die Xml-Datei soll folgendes Format haben:
Also, vereinfacht erklärt:
Ich bekomme eine csv-Datei (die Werte befinden sich in Zeilen und Spalten, das ist hier irgendwie nicht ersichtlich) mit Lastprofilwerten von mehreren Stromzählern untereinander in KW, und muss daraus (mit eine Xslt-Transformer) eine XML-Datei erstellen und die KW-Werte in KWh umwandeln (also durch 0.25 teilen).
Bitte entschuldigt wenn es irgendwo Formattierungsfehler gibt.
Ich hoffe dass jemand mir helfen kann?
Vielen Dank im Voraus
nach langer Zeit habe ich wieder eine Frage.
Ich bekomme eine csv-Datei, und um die weiter verarbeiten zu können, muss diese Datei mit einem Xslt-Transformer in das XML-Format umgewandelt werden.
Die csv-Datei sieht wie folgt aus:
Date "Time" "Service Point" Meter Number Channel Reading Unit
07.09.2015 00:15 48001006278 12345 Aggregate Active Export 1 kW
07.09.2015 00:30 48001006278 12345 Aggregate Active Export 2 kW
07.09.2015 00:45 48001006278 12345 Aggregate Active Export 3 kW
07.09.2015 01:00 48001006278 12345 Aggregate Active Export 4 kW
07.09.2015 01:15 48001006278 12345 Aggregate Active Export 5 kW
07.09.2015 01:30 48001006278 12345 Aggregate Active Export 6 kW
07.09.2015 01:45 48001006278 12345 Aggregate Active Export 7 kW
07.09.2015 02:00 48001006278 12345 Aggregate Active Export 8 kW
07.09.2015 00:15 48001006278 12345 Aggregate Active Import 1 kW
07.09.2015 00:30 48001006278 12345 Aggregate Active Import 2 kW
07.09.2015 00:45 48001006278 12345 Aggregate Active Import 3 kW
07.09.2015 01:00 48001006278 12345 Aggregate Active Import 4 kW
07.09.2015 01:15 48001006278 12345 Aggregate Active Import 5 kW
07.09.2015 01:30 48001006278 12345 Aggregate Active Import 6 kW
07.09.2015 01:45 48001006278 12345 Aggregate Active Import 7 kW
07.09.2015 02:00 48001006278 12345 Aggregate Active Import 8 kW
07.09.2015 00:15 12345678901 987654 Aggregate Active Export 1 kW
07.09.2015 00:30 12345678901 987654 Aggregate Active Export 2 kW
07.09.2015 00:45 12345678901 987654 Aggregate Active Export 3 kW
07.09.2015 01:00 12345678901 987654 Aggregate Active Export 4 kW
07.09.2015 01:15 12345678901 987654 Aggregate Active Export 5 kW
07.09.2015 01:30 12345678901 987654 Aggregate Active Export 6 kW
07.09.2015 01:45 12345678901 987654 Aggregate Active Export 7 kW
07.09.2015 02:00 12345678901 987654 Aggregate Active Export 8 kW
07.09.2015 00:15 12345678901 987654 Aggregate Active Import 1 kW
07.09.2015 00:30 12345678901 987654 Aggregate Active Import 2 kW
07.09.2015 00:45 12345678901 987654 Aggregate Active Import 3 kW
07.09.2015 01:00 12345678901 987654 Aggregate Active Import 4 kW
07.09.2015 01:15 12345678901 987654 Aggregate Active Import 5 kW
07.09.2015 01:30 12345678901 987654 Aggregate Active Import 6 kW
07.09.2015 01:45 12345678901 987654 Aggregate Active Import 7 kW
07.09.2015 02:00 12345678901 987654 Aggregate Active Import 8 kW
Die Xml-Datei soll folgendes Format haben:
<?xml version="1.0" encoding="UTF-8"?>
<smart:measuringdata>
<smart meterreading smart:unit="KWh" smart:obis="1-1.29.0" smart:id="48001006278">
<smart:value smart:date="2015-09-07T00:15:00+01:00">0.25</smart:value>
<smart:value smart:date="2015-09-07T00:30:00+01:00">0.5</smart:value>
<smart:value smart:date="2015-09-07T00:45:00+01:00">0.75</smart:value>
<smart:value smart:date="2015-09-07T01:00:00+01:00">1</smart:value>
<smart:value smart:date="2015-09-07T01:15:00+01:00">1.25</smart:value>
<smart:value smart:date="2015-09-07T01:30:00+01:00">1.5</smart:value>
<smart:value smart:date="2015-09-07T01:45:00+01:00">1.75</smart:value>
<smart:value smart:date="2015-09-07T02:00:00+01:00">2</smart:value>
</smart:meterreading>
<smart meterreading smart:unit="KWh" smart:obis="1-2.29.0" smart:id="48001006278">
<smart:value smart:date="2015-09-07T00:15:00+01:00">0.25</smart:value>
<smart:value smart:date="2015-09-07T00:30:00+01:00">0.5</smart:value>
<smart:value smart:date="2015-09-07T00:45:00+01:00">0.75</smart:value>
<smart:value smart:date="2015-09-07T01:00:00+01:00">1</smart:value>
<smart:value smart:date="2015-09-07T01:15:00+01:00">1.25</smart:value>
<smart:value smart:date="2015-09-07T01:30:00+01:00">1.5</smart:value>
<smart:value smart:date="2015-09-07T01:45:00+01:00">1.75</smart:value>
<smart:value smart:date="2015-09-07T02:00:00+01:00">2</smart:value>
</smart:meterreading>
<smart meterreading smart:unit="KWh" smart:obis="1-1.29.0" smart:id="12345678901">
<smart:value smart:date="2015-09-07T00:15:00+01:00">0.25</smart:value>
<smart:value smart:date="2015-09-07T00:30:00+01:00">0.5</smart:value>
<smart:value smart:date="2015-09-07T00:45:00+01:00">0.75</smart:value>
<smart:value smart:date="2015-09-07T01:00:00+01:00">1</smart:value>
<smart:value smart:date="2015-09-07T01:15:00+01:00">1.25</smart:value>
<smart:value smart:date="2015-09-07T01:30:00+01:00">1.5</smart:value>
<smart:value smart:date="2015-09-07T01:45:00+01:00">1.75</smart:value>
<smart:value smart:date="2015-09-07T02:00:00+01:00">2</smart:value>
</smart:meterreading>
<smart meterreading smart:unit="KWh" smart:obis="1-2.29.0" smart:id="12345678901">
<smart:value smart:date="2015-09-07T00:15:00+01:00">0.25</smart:value>
<smart:value smart:date="2015-09-07T00:30:00+01:00">0.5</smart:value>
<smart:value smart:date="2015-09-07T00:45:00+01:00">0.75</smart:value>
<smart:value smart:date="2015-09-07T01:00:00+01:00">1</smart:value>
<smart:value smart:date="2015-09-07T01:15:00+01:00">1.25</smart:value>
<smart:value smart:date="2015-09-07T01:30:00+01:00">1.5</smart:value>
<smart:value smart:date="2015-09-07T01:45:00+01:00">1.75</smart:value>
<smart:value smart:date="2015-09-07T02:00:00+01:00">2</smart:value>
</smart:meterreading>
<smart:measuringdata>
Also, vereinfacht erklärt:
Ich bekomme eine csv-Datei (die Werte befinden sich in Zeilen und Spalten, das ist hier irgendwie nicht ersichtlich) mit Lastprofilwerten von mehreren Stromzählern untereinander in KW, und muss daraus (mit eine Xslt-Transformer) eine XML-Datei erstellen und die KW-Werte in KWh umwandeln (also durch 0.25 teilen).
Bitte entschuldigt wenn es irgendwo Formattierungsfehler gibt.
Ich hoffe dass jemand mir helfen kann?
Vielen Dank im Voraus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 282288
Url: https://administrator.de/contentid/282288
Ausgedruckt am: 15.11.2024 um 11:11 Uhr
12 Kommentare
Neuester Kommentar
CSV to XML Konverter
https://de.m.wikipedia.org/wiki/Wattstunde
Gruß grexit
KW-Werte in KWh umwandeln (also durch 0.25 teilen).
hä? Da stimmt aber dann watt nich ....https://de.m.wikipedia.org/wiki/Wattstunde
Gruß grexit
btw. stimmt da zusätzlich was nicht in deinen Demo-Daten.
So wie das aussieht hast du mehrere Zähler pro Standort, aber die Zählernummer "Meter Number" ändert sich in deinem Beispiel garnicht obwohl deine Ausgabe eine Separierung vorsieht ?? Zusätzlich hat deine XML-Datei keine Prefix-Deklaration für den Prefix smart was ebenfalls zu einer nicht konformen XML-Datei führt.
Und nur mit einem XSLT-Template wirst du hier nicht hin kommen, denn normalweise hat man eine XML als Quelle für eine XSLT Transformation. Also musst du schon eine Programmier-/Skriptsprache mit ins Spiel bringen...z.B. mit Powershell schnell realisierbar.
Bitte nutze Code-Tags für deinen Quellcode:
Gruß grexit
So wie das aussieht hast du mehrere Zähler pro Standort, aber die Zählernummer "Meter Number" ändert sich in deinem Beispiel garnicht obwohl deine Ausgabe eine Separierung vorsieht ?? Zusätzlich hat deine XML-Datei keine Prefix-Deklaration für den Prefix smart was ebenfalls zu einer nicht konformen XML-Datei führt.
Und nur mit einem XSLT-Template wirst du hier nicht hin kommen, denn normalweise hat man eine XML als Quelle für eine XSLT Transformation. Also musst du schon eine Programmier-/Skriptsprache mit ins Spiel bringen...z.B. mit Powershell schnell realisierbar.
Bitte nutze Code-Tags für deinen Quellcode:
<code> Quellcode </code>
, dann sieht man auch wie deine Daten richtig formatiert sind. Was hier essentiell ist.Gruß grexit
Moinsens,
Bitte nutze für Codes die entsprechende Formatierung für Forum wie @122990 schon geschrieben hat !! Ansonsten gehen hier Sonderzeichen flöten, und du machst es den Beteiligten einfacher wenn sie deine Codes nicht auch noch zusätzlich korrigieren müssen.
DANKE!
Gruß jodel32
p.s. Haben wir jetzt schon zum xten mal erwähnt ..., langsam nervts
Bitte nutze für Codes die entsprechende Formatierung für Forum wie @122990 schon geschrieben hat !! Ansonsten gehen hier Sonderzeichen flöten, und du machst es den Beteiligten einfacher wenn sie deine Codes nicht auch noch zusätzlich korrigieren müssen.
DANKE!
Gruß jodel32
p.s. Haben wir jetzt schon zum xten mal erwähnt ..., langsam nervts
Nee, nicht nächstes mal, dann hast dus wieder vergessen, wozu gibt es wohl den Link Bearbeiten an deinem Kommentar ?! Das sind zwei kleine Wörter, ist das so schwierig ?
Zitat von @tester23:
Du musst aber bedenken dass nicht jeder der hier schreibt jeden Tag hier ist, kann also mal auch einen Fehler machen oder auch etwas vergessen.
Schon klar, aber wenn es dir jemand direkt in eine Antwort schreibt , sollte man es schon beherzigen einen kleinen Blick in die FAQ zu werfen. "Geben" und "nehmen" lautet hier die Devise.Du musst aber bedenken dass nicht jeder der hier schreibt jeden Tag hier ist, kann also mal auch einen Fehler machen oder auch etwas vergessen.
Ich kann dir leider nur mit Powershell dienen:
Gruß grexit
$csv = Import-CSV 'C:\input.csv' -Delimiter "`t"
$smartns = 'http://demo.local'
$xml = [xml]"<?xml version=""1.0"" encoding=""utf-8""?><smart:measuringdata xmlns:smart=""$smartns""></smart:measuringdata>"
$csv | group 'Service Point','Channel' | %{
$sp_node = $xml.CreateElement('smart:meterreading',$smartns)
$att_unit = $xml.CreateAttribute('smart:unit',$smartns)
$att_unit.Value = "kWh"
[void]$sp_node.Attributes.Append($att_unit)
$att_obis = $xml.CreateAttribute('smart:obis',$smartns)
if($_.Group.Channel -like '*import*'){$obis = '1-2.29.0'}else{$obis = '1-1.29.0'}
$att_obis.Value = $obis
[void]$sp_node.Attributes.Append($att_obis)
$att_id = $xml.CreateAttribute('smart:id',$smartns)
$att_id.Value = $_.Group.'Service Point'
[void]$sp_node.Attributes.Append($att_id)
$_.Group | %{
$value_node = $xml.CreateElement('smart:value',$smartns)
$value_node.InnerText = [double]$_.Reading / 4
$att_date = $xml.CreateAttribute('smart:date',$smartns)
$att_date.Value = (get-date "$($_.Date) $($_.Time)" -F 's')
[void]$value_node.Attributes.Append($att_date)
[void]$sp_node.AppendChild($value_node)
}
[void]$xml.DocumentElement.AppendChild($sp_node)
}
$xml.Save('C:\output.xml')
Zitat von @tester23:
Aber es gibt trotzdem ein Problem, die Variablen (Zeit, Verbrauchswerte oder smart:id werden nicht in der XML dargestellt oder berechnet).
Kann ich nicht nachvollziehen geht hier einwandfrei ...Aber es gibt trotzdem ein Problem, die Variablen (Zeit, Verbrauchswerte oder smart:id werden nicht in der XML dargestellt oder berechnet).
Ich bekomme da nur Nullwerte zu sehen.
Wie schon gesagt, es sind mehrere Zähler Untereinander und die haben als "Channel" entweder "Aggregate Active Export" das soll dann '1-1.29.0' oder ""Aggregate Active Import" als '1-2.29.0' dargestellt werden.
Diese Unterscheidung wird in deinem Powershell-Script auch nicht gemacht.
Die Kleinigkeit soll mal einer auf anhieb entdecken, wenn man sie nicht explizit erwähnt (da wären wir wieder beim Thema) .... lässt sich aber leicht ändern, trage ich noch nach...Wie schon gesagt, es sind mehrere Zähler Untereinander und die haben als "Channel" entweder "Aggregate Active Export" das soll dann '1-1.29.0' oder ""Aggregate Active Import" als '1-2.29.0' dargestellt werden.
Diese Unterscheidung wird in deinem Powershell-Script auch nicht gemacht.
#edit- oben angepasst.
Ich selber habe gar keine Auhnung von Power-Shell,von daher weiss ich nicht ob das machbar ist!?
Gegen Entgelt mach ich dir damit alles.Mit dieser Quelldatei:
Date "Time" "Service Point" "Meter Number" Channel Reading Unit
07.09.2015 00:15 48001006278 12345 Aggregate Active Export 1 kW
07.09.2015 00:30 48001006278 12345 Aggregate Active Export 2 kW
07.09.2015 00:45 48001006278 12345 Aggregate Active Export 3 kW
07.09.2015 01:00 48001006278 12345 Aggregate Active Export 4 kW
07.09.2015 01:15 48001006278 12345 Aggregate Active Export 5 kW
07.09.2015 01:30 48001006278 12345 Aggregate Active Export 6 kW
07.09.2015 01:45 48001006278 12345 Aggregate Active Export 7 kW
07.09.2015 02:00 48001006278 12345 Aggregate Active Export 8 kW
07.09.2015 00:15 48001006278 67890 Aggregate Active Import 1 kW
07.09.2015 00:30 48001006278 67890 Aggregate Active Import 2 kW
07.09.2015 00:45 48001006278 67890 Aggregate Active Import 3 kW
07.09.2015 01:00 48001006278 67890 Aggregate Active Import 4 kW
07.09.2015 01:15 48001006278 67890 Aggregate Active Import 5 kW
07.09.2015 01:30 48001006278 67890 Aggregate Active Import 6 kW
07.09.2015 01:45 48001006278 67890 Aggregate Active Import 7 kW
07.09.2015 02:00 48001006278 67890 Aggregate Active Import 8 kW
07.09.2015 00:15 12345678901 987654 Aggregate Active Export 1 kW
07.09.2015 00:30 12345678901 987654 Aggregate Active Export 2 kW
07.09.2015 00:45 12345678901 987654 Aggregate Active Export 3 kW
07.09.2015 01:00 12345678901 987654 Aggregate Active Export 4 kW
07.09.2015 01:15 12345678901 987654 Aggregate Active Export 5 kW
07.09.2015 01:30 12345678901 987654 Aggregate Active Export 6 kW
07.09.2015 01:45 12345678901 987654 Aggregate Active Export 7 kW
07.09.2015 02:00 12345678901 987654 Aggregate Active Export 8 kW
07.09.2015 00:15 12345678901 334456 Aggregate Active Import 1 kW
07.09.2015 00:30 12345678901 334456 Aggregate Active Import 2 kW
07.09.2015 00:45 12345678901 334456 Aggregate Active Import 3 kW
07.09.2015 01:00 12345678901 334456 Aggregate Active Import 4 kW
07.09.2015 01:15 12345678901 334456 Aggregate Active Import 5 kW
07.09.2015 01:30 12345678901 334456 Aggregate Active Import 6 kW
07.09.2015 01:45 12345678901 334456 Aggregate Active Import 7 kW
07.09.2015 02:00 12345678901 334456 Aggregate Active Import 8 kW
<?xml version="1.0" encoding="utf-8"?>
<smart:measuringdata xmlns:smart="http://demo.local">
<smart:meterreading smart:unit="kWh" smart:obis="1-1.29.0" smart:id="48001006278">
<smart:value smart:date="2015-09-07T00:15:00">0.25</smart:value>
<smart:value smart:date="2015-09-07T00:30:00">0.5</smart:value>
<smart:value smart:date="2015-09-07T00:45:00">0.75</smart:value>
<smart:value smart:date="2015-09-07T01:00:00">1</smart:value>
<smart:value smart:date="2015-09-07T01:15:00">1.25</smart:value>
<smart:value smart:date="2015-09-07T01:30:00">1.5</smart:value>
<smart:value smart:date="2015-09-07T01:45:00">1.75</smart:value>
<smart:value smart:date="2015-09-07T02:00:00">2</smart:value>
</smart:meterreading>
<smart:meterreading smart:unit="kWh" smart:obis="1-2.29.0" smart:id="48001006278">
<smart:value smart:date="2015-09-07T00:15:00">0.25</smart:value>
<smart:value smart:date="2015-09-07T00:30:00">0.5</smart:value>
<smart:value smart:date="2015-09-07T00:45:00">0.75</smart:value>
<smart:value smart:date="2015-09-07T01:00:00">1</smart:value>
<smart:value smart:date="2015-09-07T01:15:00">1.25</smart:value>
<smart:value smart:date="2015-09-07T01:30:00">1.5</smart:value>
<smart:value smart:date="2015-09-07T01:45:00">1.75</smart:value>
<smart:value smart:date="2015-09-07T02:00:00">2</smart:value>
</smart:meterreading>
<smart:meterreading smart:unit="kWh" smart:obis="1-1.29.0" smart:id="12345678901">
<smart:value smart:date="2015-09-07T00:15:00">0.25</smart:value>
<smart:value smart:date="2015-09-07T00:30:00">0.5</smart:value>
<smart:value smart:date="2015-09-07T00:45:00">0.75</smart:value>
<smart:value smart:date="2015-09-07T01:00:00">1</smart:value>
<smart:value smart:date="2015-09-07T01:15:00">1.25</smart:value>
<smart:value smart:date="2015-09-07T01:30:00">1.5</smart:value>
<smart:value smart:date="2015-09-07T01:45:00">1.75</smart:value>
<smart:value smart:date="2015-09-07T02:00:00">2</smart:value>
</smart:meterreading>
<smart:meterreading smart:unit="kWh" smart:obis="1-2.29.0" smart:id="12345678901">
<smart:value smart:date="2015-09-07T00:15:00">0.25</smart:value>
<smart:value smart:date="2015-09-07T00:30:00">0.5</smart:value>
<smart:value smart:date="2015-09-07T00:45:00">0.75</smart:value>
<smart:value smart:date="2015-09-07T01:00:00">1</smart:value>
<smart:value smart:date="2015-09-07T01:15:00">1.25</smart:value>
<smart:value smart:date="2015-09-07T01:30:00">1.5</smart:value>
<smart:value smart:date="2015-09-07T01:45:00">1.75</smart:value>
<smart:value smart:date="2015-09-07T02:00:00">2</smart:value>
</smart:meterreading>
</smart:measuringdata>
Gruß grexit