Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst Grosse XML Datei in n-kleine aufteilen. Möglichst als vbScript.

Mitglied: tklein

tklein (Level 1) - Jetzt verbinden

27.04.2009, aktualisiert 13:10 Uhr, 9717 Aufrufe, 10 Kommentare

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
Mitglied: bastla
27.04.2009 um 17:18 Uhr
Hallo tklein und willkommen als aktives Mitglied!

Etwas zum Testen:
01.
EinDatei = "D:\Gesamt.xml" 
02.
Von = "<datensatz>" 
03.
Bis = "</datensatz>" 
04.
SuchName = "<bezeichnung>(.+)</bezeichnung>" 
05.
 
06.
Set  fso = CreateObject("Scripting.FileSystemObject") 
07.
EinOrdner = fso.GetParentFolderName(EinDatei) 
08.
 
09.
set rE = New RegExp 
10.
rE.Pattern = SuchName 
11.
 
12.
Inhalt = Split(fso.OpenTextFile(EinDatei).ReadAll, vbCrLF) 
13.
 
14.
For i = 0 To UBound(Inhalt) 
15.
    If InStr(Inhalt(i), Von) > 0 Then 
16.
        Ausgabe = "" 
17.
        AusDatei = "" 
18.
        Collect = True 
19.
    End If 
20.
    If InStr(Inhalt(i), Bis) > 0 Then 
21.
        Ausgabe = Ausgabe & Inhalt(i) 
22.
        Set GefundenNamen = rE.Execute(Ausgabe) 
23.
        For Each GefundenName In GefundenNamen 
24.
            AusDatei = GefundenName.SubMatches(0) 
25.
        Next 
26.
        If AusDatei <> "" Then 
27.
            fso.CreateTextFile(EinOrdner & "\" & AusDatei).Write Ausgabe 
28.
        Else 
29.
            fso.OpenTextFile(EinOrdner & "\" & "Error.txt", 8, 1).Write "Kein Dateiname gefunden in " & vbCrLF & Ausgabe & vbCrLF & vbCrLF 
30.
        End If 
31.
        Collect = False 
32.
    End If 
33.
    If Collect Then 
34.
        Ausgabe = Ausgabe & Inhalt(i) & vbCrLf 
35.
    End If 
36.
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
Bitte warten ..
Mitglied: tklein
28.04.2009 um 00:46 Uhr
@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
Bitte warten ..
Mitglied: bastla
28.04.2009 um 07:49 Uhr
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 "Plain Code" posten ...

Grüße
bastla
Bitte warten ..
Mitglied: tklein
28.04.2009 um 10:12 Uhr
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
Bitte warten ..
Mitglied: bastla
28.04.2009 um 10:33 Uhr
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]
Bitte warten ..
Mitglied: tklein
28.04.2009 um 10:45 Uhr
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
Bitte warten ..
Mitglied: tklein
28.04.2009 um 11:43 Uhr
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
Bitte warten ..
Mitglied: bastla
28.04.2009 um 20:17 Uhr
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):
01.
Function Conv(UTF8String) 
02.
Set Stream = CreateObject("ADODB.Stream") 
03.
With Stream 
04.
    .Type = 2 
05.
    .Open 
06.
    .Charset = "Windows-1252" 
07.
    .WriteText UTF8String 
08.
    .Position = 0 
09.
    .Charset = "UTF-8" 
10.
    Conv = .ReadText 
11.
End With 
12.
Stream.Close 
13.
Set Stream = Nothing 
14.
End Function
Grüße
bastla
Bitte warten ..
Mitglied: tklein
28.04.2009 um 22:00 Uhr
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
Bitte warten ..
Mitglied: bastla
28.04.2009 um 22:07 Uhr
Hallo Thomas!

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

Grüße
bastla
Bitte warten ..
Ähnliche Inhalte
VB for Applications

Per vbscript neues element an xml datei einfügen

gelöst Frage von aletriVB for Applications1 Kommentar

guten abend an alle das xml file, dass dieser script bearbeitet sieht leer so aus: <?xml version="1.0"?> -<DynPlacement.Document> -<Config> ...

VB for Applications

Per vbscript element aus xml datei löschen

gelöst Frage von aletriVB for Applications4 Kommentare

guten abend an alle nun folgt der gegenzug nämlich <Path>C:\Program Files\Lockheed Martin\Prepar3D v4\ATiLibs\scenery</Path> entfernen! Script löscht die Zeile nicht ...

VB for Applications

XML auslesen mit VBScript: getElementsByTagName mit Platzhalter bzw. Wildcard möglich? nochmal

gelöst Frage von DschainersVB for Applications3 Kommentare

Hallo Gemeinde, ich habe im obigen Thema ein paar Kommentare hinterlegt, vielleicht kann mir da jemand helfen. Ich bin ...

VB for Applications

XML auslesen mit VBScript: getElementsByTagName mit Platzhalter bzw. Wildcard möglich?

gelöst Frage von alfabravoVB for Applications11 Kommentare

Hallo, ich möchte einige Knoten aus einer XML-Datei in eine *.csv-Datei schreiben und komme an einer Stelle nicht weiter. ...

Neue Wissensbeiträge
Windows 10

USB Maus und Tastatur versagen Dienst unter Windows 10

Erfahrungsbericht von hardykopff vor 1 TagWindows 105 Kommentare

Da steht man ziemlich dumm da, wenn der PC sich wegen fehlender USB Tastatur und Maus nicht bedienen lässt. ...

Administrator.de Feedback
Update der Seite: Alles zentriert
Information von Frank vor 1 TagAdministrator.de Feedback18 Kommentare

Hallo User, die größte Änderung von Release 5.8 ist das Zentrieren der Webseite (auf großen Bildschirmen) und ein "Welcome"-Teaser ...

Humor (lol)

WhatsApp-Nachrichten endlich auch per Bluetooth versendbar

Information von BassFishFox vor 2 TagenHumor (lol)4 Kommentare

Genau darauf habe ich gewartet! ;-) Der beliebte Messaging-Dienst WhatsApp erhält eine praktische neue Funktion: Ab dem nächsten Update ...

Google Android

Googles "Android Enterprise Recommended" für Unternehmen

Information von kgborn vor 3 TagenGoogle Android3 Kommentare

Hier eine Information, die für Administratoren und Verantwortliche in Unternehmen, die für die Beschaffung und das Rollout von Android-Geräten ...

Heiß diskutierte Inhalte
Windows Server
Standortvernetzung zu einem Strato VServer (Windows)
Frage von matzefratze81Windows Server10 Kommentare

Moin, ich komme aus einem Enterprise-Umfeld und habe den Fehler gemacht, dass ich mich auf ein kleines Unternehmen eingelassen ...

Grafikkarten & Monitore
4k EIZO Monitor, Fernseher und Splitter
Frage von LerxxeyGrafikkarten & Monitore9 Kommentare

Hallo Zusammen, vielleicht könnt ihr mir bei einem Problem helfen wo ich einfach nicht mehr weiterkomme Und zwar haben ...

TK-Netze & Geräte
Fax im Betrieb
Frage von gansa28TK-Netze & Geräte6 Kommentare

Hallo zusammen, Endlich wurden meine Gebete Erhört und der Rechner meines Bekannten dem ich etwas unter die Arme greife, ...

Windows Server
HyperV Failover Cluster Konzeption und Aufbau
Frage von snowboard86Windows Server5 Kommentare

Hallo liebe KollegInnen, Ich habe eine Frage zu Hyper V Failover-Clusters. Wir sind ein mittelständisches Handelsunternehmen und haben aktuell ...