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, 9198 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 ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
XML
XML Datei Fehler? (1)

Frage von Patrick-IT zum Thema XML ...

Batch & Shell
Script zum XML Datei Umschreiben (12)

Frage von cberndt zum Thema Batch & Shell ...

PHP
gelöst Externe XML-Datei in PHP auslesen (18)

Frage von Akrosh zum Thema PHP ...

Windows Server
Windows Bereitstellungsdienst und .xml-Datei erstellen (1)

Frage von 131275 zum Thema Windows Server ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...