122708
Goto Top

Aus Dateien Strukturiert XMLs erstellen

Schönen guten Morgen,

ich bin neu also verzeiht Eventuelle ungenaue Fragestellungen ;)

Ausgangssituation:

ca. 1600 1Kb große Dateien

die folgendermaßen aufgebaut sind vom Inhalt:

Typ;Count
10;70

Das ; fungiert als Trennung Die Oberste Zeile ist die Überschrift die Unterzeile der Wert.

ich möchte daraus jetzt XML´s erstellen, für jede Quelle eine wobei das Ziel wie die Quellen heißen sollte, bis natürlich auf die Dateiendung.
Die Dateien befinden sich alle in einem Ordner.

Das Ziel sollte so aussehen:

<?xml version="1.0"?>  
<Type="10">  
<Barcode/>
<Count>70</Count>
</Document>


das von Hand zu machen, sagen wir ist etwas mühsam ;)


Ich habe schon Konvertierungsprogramme etc. gesucht und leider nicht gefunden.


Dachte es sei Eventuell mit Excel und VBA möglich aber darin sind meine Kenntisse naja ich nenne es lieber vorsichtig "nicht vorhanden".


Wäre nett wenn jemand Helfen könnte.


Gruß Maxiam

Content-Key: 275308

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

Printed on: April 19, 2024 at 10:04 o'clock

Mitglied: 114757
114757 Jun 22, 2015 at 08:18:44 (UTC)
Goto Top
Moin Maxiam,
ein fertiges Script für einen CSV-to-XML Converter findest du hier:
CSV to XML Konverter

Gruß jodel32
Mitglied: 122708
122708 Jun 22, 2015 at 08:25:34 (UTC)
Goto Top
Servus,

vielen Dank jodel32 face-smile

Sollte ich hierfür dann erstmal alle Dokumente in CSV Dateien umkonvertieren oder funktioniert dies ebenso mit .txt Dateien?
Mitglied: 114757
114757 Jun 22, 2015 at 08:27:31 (UTC)
Goto Top
Zitat von @122708:
Sollte ich hierfür dann erstmal alle Dokumente in CSV Dateien umkonvertieren oder funktioniert dies ebenso mit .txt Dateien?
Solange die Dateien eine CSV-Struktur haben ist die Endung dem Script vollkommen wurscht. Nur die Angabe der Delimiter muss stimmen.
Mitglied: 122708
122708 Jun 22, 2015 updated at 08:57:47 (UTC)
Goto Top
Ok, danke ;)

Also wenn ich das Script ausführe klappt ;)

Es passiert manchmal aber das manche dieser Zeilen leer ist, das mag er nicht so ganz ;)

  <?xml version="1.0" encoding="utf-8" ?>  
- <root>
- <row>
  <DocuemntBatchType>10</DocuemntBatchType> 
  <ScanDate>15-06-22090600</ScanDate> 
  </row>
  </root>

so sieht es jetzt aus ;)

Wie bekomme ich es hin das er
<?xml version="1.0"?>   
<Type="10">   
<Barcode/> 
<Count>70</Count> 
</Document>

das es so aussieht? Habe etwas rumpboiert, aber danach war das Script hinüber, da ich leider nicht viel davon verstehe!

die 1 Zeile mit der Version ist egal

Gruß Maxiam

PS: Danke bisher für die gute Hilfe!
Mitglied: 114757
114757 Jun 22, 2015 updated at 08:56:07 (UTC)
Goto Top
Zitat von @122708:
muss ich bestimmt nichts in dem Script ändern?
Du weist schon das das ein Powershell-Script ist ?
Diese Zeile 6 im Script musst du natürlich an deine Endung anpassen, wenn man einmal durch das Script gegangen wäre face-sad :
gci $folder -Filter "*.csv"  | %{ 
ändern in
gci $folder -Filter "*.txt"  | %{ 
Mitglied: 122708
122708 Jun 22, 2015 at 08:58:38 (UTC)
Goto Top
Servus Jodel,

da warst du schneller als ich bearbeiten konnte face-smile

Ist schon erledigt mit .txt, ich hatte es erster an der Falschen stelle geändert.
Mitglied: 114757
114757 Jun 22, 2015 updated at 09:06:46 (UTC)
Goto Top
Zitat von @122708:
Wie bekomme ich es hin das er
> <?xml version="1.0"?>   
> <Type="10">   
> <Barcode></Barcode> 
> <Count>70</Count> 
> </Document>
> 
> 

das es so aussieht?
Das ist kein valides XML und geht so nicht ... dein DOCUMENT-Knoten hat kein entsprechendes Opening TAG !!
Und bei mehreren Zeilen geht's dann so auch nicht mehr in dieser Art und Weise...
Mitglied: 122708
122708 Jun 22, 2015 updated at 09:12:19 (UTC)
Goto Top
Ich habe mich glaube ich etwas Unmissverständlich ausgedrückt ;)

Entschuldigeface-smile

Also was mich stört und ich nicht rausbekomme, ist row ;)

Ich habe nur .txt die aus Headzeile und Entsprechenden werten besteht ;)


und

er spuckt mir keine XML aus wenn ein wert fehlt also z.b. <Count></Count>
ich wusste bissher nicht das ich solche Dateien habe face-smile

bzw. die XML sieht dan so aus:
  <?xml version="1.0" encoding="utf-8" ?>   
- <Document>
- <row>
  <Type>
  <Count>600</Count> 
  </row>
  </Document>

Vielen Dank bissher jodel face-smile


Gruß Maxiam,

Das Forum ist echt klasse ich hätte nicht gedacht so schnell Hilfe zu bekommen face-smile
Mitglied: 114757
114757 Jun 22, 2015 updated at 09:10:49 (UTC)
Goto Top
Dann poste doch bitte mal mit Codetags (<code> Quellcode </code>) ein korrektes Beispiel deiner CSV-Datei. Danke !!
Mitglied: 114757
114757 Jun 22, 2015 updated at 09:16:18 (UTC)
Goto Top
und das hier:
<Type="10">
geht auch nicht, nur ein Attribut ohne Elementname.
Mitglied: 122708
122708 Jun 22, 2015 updated at 09:22:09 (UTC)
Goto Top
Sehr gerne Jodel face-smile

die .txt datei sieht folgendermaßen aus

Type;Date;Kommentar;Count;
10;15-06-22090600;;600

eventuell hilft das face-smile

Mehr steht nicht in den txt files.

Grüße Maxiam


Zitat von @114757:

und das hier:
> <Type="10">
geht auch nicht, nur ein Attribut ohne Elementname.

das ist mir klar geworden , was nicht geht geht nicht face-smile

Bissher bleibt nur der fehler das er nicht so Korrekt mit leeren Zeilen umgeht und die row geschichte

aussehen sollte es ja richtig dann so:
  <?xml version="1.0" encoding="utf-8" ?>   
- <Document>
- <row>
  <Type>10</Type> 
  <Date>15-06-22090600</Date> 
  <Kommentar></Kommentar> 
  <Count>600</Count> 
  </row>
  </Document>
Mitglied: 114757
114757 Jun 22, 2015 updated at 09:31:58 (UTC)
Goto Top
Bissher bleibt nur der fehler das er nicht so Korrekt mit leeren Zeilen umgeht und die row geschichte
Du wirst immer konfuser ... face-sad
Was meinst du mit leeren Zeilen ? Spalten oder die txt hat zwar Überschriften aber keine Daten ???? und mit der row-Geschichte ?? die du ja jetzt plötzlich in deiner finalen Version wieder drin hast ..?? Bitte bemüh dich doch mal dein Vorhaben konkret und exakt zu formulieren . Danke !!!!!!!!!!
Mitglied: 122708
122708 Jun 22, 2015 updated at 09:50:23 (UTC)
Goto Top
Ok vielen Dank für die Kritik face-smile


Das Feld Kommentar ist z.b. manchmal leer.

Dies sollte auch in der XML leer sein ist zustand ist folgender:

<?xml version="1.0" encoding="utf-8" ?>   
<Document>
 <row>
<Type>10</Type> 
 <Date>15-06-22090600</Date> 
</Kommentar>
 <Count>600</Count> 
 </row>
 </Document>

ich möchte das es so aussieht:

<?xml version="1.0" encoding="utf-8" ?>   
<Document>
<Type>10</Type> 
<Date>15-06-22090600</Date> 
<Kommentar></Kommentar> #wenn leer kein Eintrag
<Count>600</Count> 
</Document>
Mitglied: 114757
114757 Jun 22, 2015 updated at 10:13:13 (UTC)
Goto Top
Das Feld Kommentar ist z.b. manchmal leer.
Das ist per Default so ....oder meinst du das der TAG nicht erscheinen soll ?

Das geht dann so:
(die ROW-Zeile habe ich jetzt auch mal entfernt, war ja leider nicht ganz klar ob du die jetzt auch haben wolltest)
param(
    [string]$folder,
    [string]$delimiter = ";"  
)
# Alle CSV-Dateien des Ordners durchlaufen
gci $folder -Filter "*.txt" | %{  
    write-host "Konvertiere '$($_.Fullname)' ..." -ForegroundColor Green  
    # importiere CSV-Datei als Objekt
    $csv = import-csv $_.Fullname -Delimiter $delimiter
    if ($csv){
        # 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"?><Document></Document>')  
        # Root-Knoten referenzieren
        $root = $xml.SelectSingleNode("/Document")  
        # für jede Zeile der CSV-Datei ...
        foreach($line in $csv){
            # 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($_)
                 $col.InnerText = $line.($_)
                 $root.AppendChild($col) | out-null
            }
        }
        # Speichere die neue XML-Datei
        $xml.Save($_.DirectoryName + "\" + $_.BaseName + ".xml")  
    }
}
Geht einwandfrei !
Mitglied: 122708
122708 Jun 22, 2015 at 09:49:59 (UTC)
Goto Top
Der TAG schließt sich nicht

  <?xml version="1.0" ?>   
- <Document>
- <row>
  <Count>3</Count> 
  <Date>150622090600</Date> 
  <Kommentar /> 
  <Type>10</Type> 
  </row>
  </Document>

Der Sollte ja aber geschlossen sein, ebenso wenn der TAG ein leerzeichen enthält bricht er ab bzw. überspringt diesen TAG , habe eben Dateien gesehen wo das Feld "Kommentar" "Kommentar Zitat" heißt.
Mitglied: 114757
114757 Jun 22, 2015 updated at 09:52:11 (UTC)
Goto Top
<Kommentar />
Das ist in dieser Art geschlossen!! Pfeif dir doch bitte erst mal die XML-Grundlagen rein !

Viel Erfolg dann noch
Wird mir zu blöd ...
Mitglied: 122708
122708 Jun 22, 2015 at 09:51:41 (UTC)
Goto Top
Zitat von @114757:

> Das Feld Kommentar ist z.b. manchmal leer.
Das ist per Default so ....oder meinst du das der TAG nicht erscheinen soll ?

Das geht dann so:
(die ROW-Zeile habe ich jetzt auch mal entfernt, war ja leider nicht ganz klar ob du die jetzt auch haben wolltest)
> param(
>     [string]$folder,
>     [string]$delimiter = ";"  
> )
> # Alle CSV-Dateien des Ordners durchlaufen
> gci $folder -Filter "*.txt" | %{  
>     write-host "Konvertiere '$($_.Fullname)' ..." -ForegroundColor Green  
>     # importiere CSV-Datei als Objekt
>     $csv = import-csv $_.Fullname -Delimiter $delimiter
>     if ($csv){
>         # 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"?><Document></Document>')  
>         # Root-Knoten referenzieren
>         $root = $xml.SelectSingleNode("/Document")  
>         # für jede Zeile der CSV-Datei ...
>         foreach($line in $csv){
>             # für jede Spalte der Zeile erstelle ein neues Element mit dem Namen der Spalte und dem Inhalt der aktuellen
> Zeile
>             $cols | %{
>                if ($line.($_) -ne ""){  
>                  $col = $xml.CreateElement($_)
>                  $col.InnerText = $line.($_)
>                  $root.AppendChild($col) | out-null
>                }
>             }
>         }
>         # Speichere die neue XML-Datei
>         $xml.Save($_.DirectoryName + "\" + $_.BaseName + ".xml")  
>     }
> }
> 
Geht einwandfrei !


Genau Row sollte raus, der Tag der sich jetzt nicht schließt ist nun Ausgeblendet was aber ja nicht so sein sollte, er soll sich ja nur richtig aufbauen :D
Mitglied: 114757
114757 Jun 22, 2015 updated at 09:54:50 (UTC)
Goto Top
Zitat von @122708:
Genau Row sollte raus, der Tag der sich jetzt nicht schließt ist nun Ausgeblendet was aber ja nicht so sein sollte, er soll
sich ja nur richtig aufbauen :D
Wie gesagt die Syntax ist RICHTIG !!!!
<Kommentar /> ist nach XML Sytax korrekt geschlossen !!
http://www.w3schools.com/schema/schema_complex_empty.asp
Mitglied: 122708
122708 Jun 22, 2015 updated at 09:55:50 (UTC)
Goto Top
Danke Jodel,

ich muss mich gerade das erstemal mit XML beschäftigen entschuldigen wenn es manchmal dämlich rüberkommt;)

Dan eben der Vordereteil vom Tag
also

<Kommentar>gut</Kommentar>

</Kommentar> #Wenn zeile leer


Wieso erscheint der ich nenne es jetzt Eröffnungtag: <Kommentar> nicht?

Mir ist bewusst das es sicherlich gewollt ist aber kann man den trotzdem haben?


Was bleibt ist wenn der TAG in der .txt ein leerzeichen enthält, überspringt er diesen.
Mitglied: 114757
114757 Jun 22, 2015 at 09:57:45 (UTC)
Goto Top
Zitat von @122708:
</Kommentar>
Das kann nicht sein, das dieser so erscheint !
Was bleibt ist wenn der TAG in der .txt ein leerzeichen enthält, überspringt er diesen.
Nö hier nicht ...
Ausgabe sieht hier so aus:

0161263c414eef7286003488b312a895
Mitglied: 122708
122708 Jun 22, 2015 updated at 10:13:10 (UTC)
Goto Top
So damit wir auf den selben Stand kommen,

ich bin langsam etwas verwirrt;)

Das ist die .txt
Type;Date;Kommentar;Count
10;150622090600;;3


ich habe den Script aus deinem ersten Post hierfür verwendet, damit es jetzt zu keinen Verwirrungen kommt!
<?xml version="1.0" encoding="utf-8" ?>   
- <root>
- <row>
  <Count>3</Count> 
  <Date>150622090600</Date> 
  <Kommentar /> 
  <Type>10</Type> 
  </row>
  </root>

das Spruckt er mir aus wenn Kommentar leer ist als XML-File
Ebenso verschiebt er den ersten Tag Typ an das Ende :/

Wenn Der Tag ein Leerzeichen enthält kommt folgendes bei raus:
die .txt
Type;Date;Kommentar Zitat;Count
10;150622090600;;3

  <?xml version="1.0" encoding="utf-8" ?>   
- <root>
- <row>
  <Count>3</Count> 
  <Date /> 
  <Type>10</Type> 
  </row>
  </root>

Stimmt ja nicht so;)


So ich möchte erreichen das :

Die Tags Angeordnet sind wie in der .txt
Er auch Tags mit Leerzeichen und Sonderzeichen nimmt
und das ROW nicht mit ausgegeben wird face-smile


Und vielen Dank für die Geduld :D
Mitglied: 114757
Solution 114757 Jun 22, 2015 updated at 10:36:02 (UTC)
Goto Top
Die Tags Angeordnet sind wie in der .txt
Das ist in einer XML meistens egal aber bitte, dann hier die Dummie-Version ...
param(
    [string]$folder,
    [string]$delimiter = ";"  
)
# Alle CSV-Dateien des Ordners durchlaufen
gci $folder -Filter "*.txt" | %{  
    write-host "Konvertiere '$($_.Fullname)' ..." -ForegroundColor Green  
    # importiere CSV-Datei als Objekt
    $csv = import-csv $_.Fullname -Delimiter $delimiter
    if ($csv){
       $content = @"  
<?xml version="1.0" encoding="utf-8" ?>  
<document>
  <Type>$($csv.Type)</Type>
  <Date>$($csv.Date)</Date>
  <Kommentar>$($csv.Kommentar)</Kommentar>
  <Count>$($csv.Count)</Count>
</document>
"@ | Set-Content -Path ($_.DirectoryName + "\" + $_.BaseName + ".xml")  
    }
}


Wenn das Encoding nicht stimmt, musst du bei Import-CSV das entsprechende Encoding mit angeben (dafür brauchst du aber mindestens Powershell 3.0):
$csv = import-csv $_.Fullname -Delimiter $delimiter -Encoding UTF8

Und tschüss .... i'm out now


Powershell Tutorials
Mitglied: 122708
122708 Jun 22, 2015 at 10:33:00 (UTC)
Goto Top
Perfekt :D

Jetzt lässt sich die xml nichtmehr per IE öffnen, aber der Inhalt stimmt , ich bin Zufrieden face-smile

Vielen Dank Jodel

Du hast mir bestimmt Stundenlanges Herumspielen erspart!

Ich würde mich gerne mehr damit befassen aber fürchte ich würde ich es wohl nie wieder brauchen zumal ich schon nicht ohne GUI zurecht komme :D


Grüße Maxiam
Mitglied: 114757
Solution 114757 Jun 22, 2015 updated at 11:30:05 (UTC)
Goto Top
Jetzt lässt sich die xml nichtmehr per IE öffnen
War nur ein Typo drin, ist korrigiert ...