Grosse XML Datei in n-kleine aufteilen. Möglichst als vbScript.
Ich bin bereits seit geraumer Zeit stiller Nutzer dieser Site und habe eigentlich zu allen Fragen eine Antwort gefunden. Allerdings habe ich nun ein Problem bei dem ich eure Hilfe brauche.
Eine größere XML Datei soll anhand einer bestimmten Node in kleine Dateien aufgeteilt werden.
Die Originaldatei sieht folgendermaßen aus:
<file>
<datensatz>
<bezeichnung>Name1</bezeichnung>
<feld1>11111</feld1>
<feld2>22222</feld2>
usw.
usw.
usw.
</datensatz>
<datensatz>
<bezeichnung>Name2</bezeichnung>
<feld1>33333</feld1>
<feld2>44444</feld2>
usw.
usw.
usw.
</datensatz>
<datensatz>
<bezeichnung>Name3</bezeichnung>
<feld1>55555</feld1>
<feld2>66666</feld2>
usw.
usw.
usw.
</datensatz>
</file>
Jetzt soll die Datei anhand der Datensätze aufgeteilt werden, wobei das Feld Bezeichnung den Datensatzname vorgibt.
Datei 1 heißt Name1 und hat den Inhalt ...
<datensatz>
<bezeichnung>Name1</bezeichnung>
<feld1>11111</feld1>
<feld2>22222</feld2>
usw.
usw.
usw.
</datensatz>
Datei 2 heißt Name2 und hat den Inhalt ...
<datensatz>
<bezeichnung>Name3</bezeichnung>
<feld1>33333</feld1>
<feld2>44444</feld2>
usw.
usw.
usw.
</datensatz>
und so weiter ...
Falls jemand von euch eine Idee hat so wäre ich sehr dankbar. Daher bereits jetzt vielen Dank im Voraus.
Thomas
Eine größere XML Datei soll anhand einer bestimmten Node in kleine Dateien aufgeteilt werden.
Die Originaldatei sieht folgendermaßen aus:
<file>
<datensatz>
<bezeichnung>Name1</bezeichnung>
<feld1>11111</feld1>
<feld2>22222</feld2>
usw.
usw.
usw.
</datensatz>
<datensatz>
<bezeichnung>Name2</bezeichnung>
<feld1>33333</feld1>
<feld2>44444</feld2>
usw.
usw.
usw.
</datensatz>
<datensatz>
<bezeichnung>Name3</bezeichnung>
<feld1>55555</feld1>
<feld2>66666</feld2>
usw.
usw.
usw.
</datensatz>
</file>
Jetzt soll die Datei anhand der Datensätze aufgeteilt werden, wobei das Feld Bezeichnung den Datensatzname vorgibt.
Datei 1 heißt Name1 und hat den Inhalt ...
<datensatz>
<bezeichnung>Name1</bezeichnung>
<feld1>11111</feld1>
<feld2>22222</feld2>
usw.
usw.
usw.
</datensatz>
Datei 2 heißt Name2 und hat den Inhalt ...
<datensatz>
<bezeichnung>Name3</bezeichnung>
<feld1>33333</feld1>
<feld2>44444</feld2>
usw.
usw.
usw.
</datensatz>
und so weiter ...
Falls jemand von euch eine Idee hat so wäre ich sehr dankbar. Daher bereits jetzt vielen Dank im Voraus.
Thomas
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 114750
Url: https://administrator.de/contentid/114750
Ausgedruckt am: 24.11.2024 um 11:11 Uhr
11 Kommentare
Neuester Kommentar
Hallo tklein und willkommen als aktives Mitglied!
Etwas zum Testen:
Die Einzeldateien werden im selben Ordner wie die Gesamtdatei erstellt. Sollte es für einen Datensatz nicht möglich sein, einen Dateinamen zu finden, werden die entsprechenden Zeilen in die Datei "Error.txt" geschrieben.
Grüße
bastla
Etwas zum Testen:
EinDatei = "D:\Gesamt.xml"
Von = "<datensatz>"
Bis = "</datensatz>"
SuchName = "<bezeichnung>(.+)</bezeichnung>"
Set fso = CreateObject("Scripting.FileSystemObject")
EinOrdner = fso.GetParentFolderName(EinDatei)
set rE = New RegExp
rE.Pattern = SuchName
Inhalt = Split(fso.OpenTextFile(EinDatei).ReadAll, vbCrLF)
For i = 0 To UBound(Inhalt)
If InStr(Inhalt(i), Von) > 0 Then
Ausgabe = ""
AusDatei = ""
Collect = True
End If
If InStr(Inhalt(i), Bis) > 0 Then
Ausgabe = Ausgabe & Inhalt(i)
Set GefundenNamen = rE.Execute(Ausgabe)
For Each GefundenName In GefundenNamen
AusDatei = GefundenName.SubMatches(0)
Next
If AusDatei <> "" Then
fso.CreateTextFile(EinOrdner & "\" & AusDatei).Write Ausgabe
Else
fso.OpenTextFile(EinOrdner & "\" & "Error.txt", 8, 1).Write "Kein Dateiname gefunden in " & vbCrLF & Ausgabe & vbCrLF & vbCrLF
End If
Collect = False
End If
If Collect Then
Ausgabe = Ausgabe & Inhalt(i) & vbCrLf
End If
Next
Grüße
bastla
Hallo tklein!
Versuch es mit folgenden Änderungen:
Zeile 12:
Zeile 27:
Zeile 29:
Damit werden die Lese- und Schreibvorgänge auf Unicode umgestellt.
Grüße
bastla
[Edit] Fehlende schließende Klammer für Zeile 12 ergänzt [/Edit]
Versuch es mit folgenden Änderungen:
Zeile 12:
Inhalt = Split(fso.OpenTextFile(EinDatei,1,False,True).ReadAll, vbCrLF)
fso.CreateTextFile(EinOrdner & "\" & AusDatei,True,True).Write Ausgabe
fso.OpenTextFile(EinOrdner & "\" & "Error.txt",8,True,True).Write "Kein Dateiname gefunden in " & vbCrLF & Ausgabe & vbCrLF & vbCrLF
Grüße
bastla
[Edit] Fehlende schließende Klammer für Zeile 12 ergänzt [/Edit]
Hallo tklein!
Die Verwendung der VBS-Unicode-Funktionalität scheitert hier an der Tatsache, dass die Daten im 8-Bit-Format ("UTF-8") vorliegen, VBS aber die 16-Bit-Version erwartet - daher muss eine Konvertierung (des Dateinamens) erfolgen.
Füge dazu nach Zeile 26 ein:
und ergänze das Script (am Ende) um die folgende Function (auf Basis eines hier präsentierten Scripts):
Grüße
bastla
Die Verwendung der VBS-Unicode-Funktionalität scheitert hier an der Tatsache, dass die Daten im 8-Bit-Format ("UTF-8") vorliegen, VBS aber die 16-Bit-Version erwartet - daher muss eine Konvertierung (des Dateinamens) erfolgen.
Füge dazu nach Zeile 26 ein:
AusDatei = Conv(AusDatei) 'UTF-8-Text konvertieren
Function Conv(UTF8String)
Set Stream = CreateObject("ADODB.Stream")
With Stream
.Type = 2
.Open
.Charset = "Windows-1252"
.WriteText UTF8String
.Position = 0
.Charset = "UTF-8"
Conv = .ReadText
End With
Stream.Close
Set Stream = Nothing
End Function
bastla
Hallo bastla,
wenn ich dein Script übernehme, bekomme ich Fehler, wie "Das kaufmännische Und-Zeichen (&) ist nicht zulässig. Der &-Operator ist für eine zukünftige Verwendung reserviert."
Könntest du mir deine Lösung posten, werde ich sehr dankbar. An sich habe gleiche Aufgabe wie du, musste ich nur anpassen ... vG Anna
wenn ich dein Script übernehme, bekomme ich Fehler, wie "Das kaufmännische Und-Zeichen (&) ist nicht zulässig. Der &-Operator ist für eine zukünftige Verwendung reserviert."
Könntest du mir deine Lösung posten, werde ich sehr dankbar. An sich habe gleiche Aufgabe wie du, musste ich nur anpassen ... vG Anna