Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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.

Frage Entwicklung Batch & Shell

Mitglied: tklein

tklein (Level 1) - Jetzt verbinden

27.04.2009, aktualisiert 13:10 Uhr, 9458 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
Batch & Shell
Powershell Performanceproblem bei Auswertung einer XML-Datei (1)

Frage von Kraemer zum Thema Batch & Shell ...

XML
gelöst XML Datei per Skript ändern (12)

Frage von chrisen zum Thema XML ...

XML
gelöst XML Datei mit Powershell splitten (2)

Frage von LianenSchwinger zum Thema XML ...

XML
XML Datei Fehler? (1)

Frage von Patrick-IT zum Thema XML ...

Neue Wissensbeiträge
Windows Server

Umstellung SHA 1 auf SHA 2 - Migration der CA von CSP auf KSP

Tipp von Badger zum Thema Windows Server ...

Windows 10

Quato DTP94 unter Windows 10 x64 installieren und verwenden

Anleitung von anteNope zum Thema Windows 10 ...

Windows 10

Win10 1703 und Nutzerkennwörter bei Ersteinrichtung - erstaunliche Erkenntnis

(15)

Erfahrungsbericht von DerWoWusste zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Server-Hardware
HP DL380 G7: Booten vom USB via USB 3.1-PCI-e Karte möglich? (24)

Frage von Paderman zum Thema Server-Hardware ...

Windows 7
Bluesreens unternehmensweit (19)

Frage von SYS64738 zum Thema Windows 7 ...

LAN, WAN, Wireless
IP Adressen - Modem - Switch - Accesspoint (18)

Frage von teuferl82 zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
gelöst DNS ins mehreren Subnetzen (15)

Frage von joerg zum Thema Windows Netzwerk ...