tklein
Goto Top

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

Content-Key: 114750

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

Printed on: April 25, 2024 at 05:04 o'clock

Member: bastla
bastla Apr 27, 2009 at 15:18:53 (UTC)
Goto Top
Hallo tklein und willkommen als aktives Mitglied!

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
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
Member: tklein
tklein Apr 27, 2009 at 22:46:36 (UTC)
Goto Top
@bastla

Du bist der Größte. Bis auf eine 'vermutliche' Kleinigkeit hat alles 1a funktioniert. Danke dafür. Allerdings gibt es ein Problem mit Umlauten im Feld Bezeichnung. Aus einem ä wird z. B. ä und aus ü ein ü, usw. Wenn du hierfür noch einen Lösungsansatz hättest, dann nehme ich dich in meine Hall of Fame auf. ;)

Jetzt erst einmal 'Gute Nacht'.

Thomas
Member: bastla
bastla Apr 28, 2009 at 05:49:35 (UTC)
Goto Top
Hallo tklein!

An sich sollten alle Zeichen unverändert übernommen werden.

Woher stammen denn die Daten bzw wie sind sie codiert? Du könntest versuchsweise einen "Problemfall" in der Formatierung "" posten ...

Grüße
bastla
Member: tklein
tklein Apr 28, 2009 at 08:12:24 (UTC)
Goto Top
Guten Morgen Bastla,

da du augenscheinlich den Text nur splittest und nicht bearbeitest kann ich mir auch nicht erklären warum die Umlaute und die Sonderzeichen umgesetzt werden. Zu deiner Frage. Die Daten kommen aus einer von einem meiner Vorgänger 'selbstgeschriebenen' Besuchsbericht Verwaltung. Hinter jeden der XML Sätze hängt noch ein physikalisches Dokument in Form einer Word und/oder Excel Datei die separat exportiert werden. Diese werden dann über den Betreff und das Datum miteinander verschmolzen und nach MS CRM 4.0 geschoben.

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<besuchsbericht>
    <betreff>Übersicht der anstehenden Änderungen</betreff>
    <kontakt>Klaus Mustermann</kontakt>
    <firma>Mustermann GmbH & Co KG</firma>
    <datum>2009.03.01</datum>
    <detail1>AAAAAAAAAAA</detail1>
    <detail2>BBBBBBBBBBB</detail2>
</besuchsbericht>

Daraus macht dein Script folgenden Dateinamen ...

Übersicht der anstehenden Änderungen

mit dem richtigen Inhalt ...

<besuchsbericht>
    <betreff>Übersicht der anstehenden Änderungen</betreff>
    <kontakt>Klaus Mustermann</kontakt>
    <firma>Mustermann GmbH & Co KG</firma>
    <datum>2009.03.01</datum>
    <detail1>AAAAAAAAAAA</detail1>
    <detail2>BBBBBBBBBBB</detail2>
</besuchsbericht>

Ich hoffe das hilt dir weiter!?

Thomas
Member: bastla
bastla Apr 28, 2009 at 08:33:30 (UTC)
Goto Top
Hallo tklein!

Versuch es mit folgenden Änderungen:
Zeile 12:
Inhalt = Split(fso.OpenTextFile(EinDatei,1,False,True).ReadAll, vbCrLF)
Zeile 27:
fso.CreateTextFile(EinOrdner & "\" & AusDatei,True,True).Write Ausgabe
Zeile 29:
fso.OpenTextFile(EinOrdner & "\" & "Error.txt",8,True,True).Write "Kein Dateiname gefunden in " & vbCrLF & Ausgabe & vbCrLF & vbCrLF
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]
Member: tklein
tklein Apr 28, 2009 at 08:45:52 (UTC)
Goto Top
Hallo nochmal,

in deiner Zeile 12 fehlt eine Klammer um 'EinDatei' (Mein Fehler korrigiert!)

Inhalt = Split(fso.OpenTextFile(EinDatei,1,False,True).ReadAll, vbCrLF)

wenn ich diese allerdings setze, meldet er folgenden Fehler

Skript:    d:\Labor\sp.vbs
Zeile:     12
Zeichen:   1
Fehler:    Objekt erforderlich: 'Wahr'
Code:      800A01A8
Quelle:    Laufzeitfehler in Microsoft VBScript

Thomas
Member: tklein
tklein Apr 28, 2009 at 09:43:04 (UTC)
Goto Top
Oh Bastla ...

ich habe deine Korrektur des Klammerfehlers gerade bei mir korrigiert und das Script laufen lassen. Zwar kommt jetzt gar kein Fehler mehr, allerdings werden auch keine Dateien mehr erstellt.

Daher habe ich mal selbst versucht mit mit den Parametern des OpenTextFile Befehls auseinander zu setzen und alle Möglichkeiten des FORMATS (0, -1, -2) durchprobiert. Allerdings immer mit dem Ergebnis das entweder die Umlaute in den Dateinamen wieder defekt sind, bzw. gar keine Dateien erzeugt werden.

Mit meinen hoffentlich noch geringen vbs Kenntnissen bin ich wieder am Ende. Hast du noch ne Idee!?

Thomas
Member: bastla
bastla Apr 28, 2009 at 18:17:05 (UTC)
Goto Top
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:
AusDatei = Conv(AusDatei) 'UTF-8-Text konvertieren
und ergänze das Script (am Ende) um die folgende Function (auf Basis eines hier präsentierten Scripts):
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
Grüße
bastla
Member: tklein
tklein Apr 28, 2009 at 20:00:35 (UTC)
Goto Top
Hallo Bastla,

mein Held! Nachdem ich die Snippets aus deinem letzten Post in dein erstes Script eingebaut habe funktioniert alles einwandfrei.

Nocheinmal herzlichen Dank für deine Mühe und die Hilfe.


Thomas
Member: bastla
bastla Apr 28, 2009 at 20:07:43 (UTC)
Goto Top
Hallo Thomas!

Freut mich, dass es klappt face-smile (und ich habe auch wieder dazugelernt: "UTF-8" hatte ich - wie Du gemerkt haben dürftest face-wink - bisher noch nicht "verscriptet" ...)

Grüße
bastla
Member: Anna85
Anna85 Oct 01, 2019 at 12:43:19 (UTC)
Goto Top
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