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.

Frage Entwicklung Batch & Shell

Mitglied: tklein

tklein (Level 1) - Jetzt verbinden

27.04.2009, aktualisiert 13:10 Uhr, 9595 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
Erkennung und -Abwehr

Necur-Botnet soll Erpressungstrojaner Scarab massenhaft verbreiten

Information von BassFishFox vor 6 StundenErkennung und -Abwehr

12,5 Millionen Spam-Mails aus einem Bot-Netz mit 6 Millionen Computern? Eigentlich eine schwache Leistung. Die Erpresser setzen dabei auf ...

Microsoft

Nadeldrucker-Problem unter Windows - Microsoft liefert Updates

Information von BassFishFox vor 6 StundenMicrosoft

Hat ja nicht lange gedauert. Nachdem die November-Updates für Windows 7, 8.1 und 10 zahlreiche Nadeldrucker lahmgelegt hatten, stellt ...

Linux

Limux-Ende in München: Wie ein Linux Projekt unter Ausschluss der Öffentlichkeit zerstört wurde

Information von Frank vor 14 StundenLinux14 Kommentare

Mein persönlicher Kommentar zum Thema "Limux-Ende". Die SPD-Politikerin Anne Hübner hat die Richtung von München ganz klar definiert: "Wir ...

Batch & Shell

Open Object Rexx: Eine mittlerweile fast vergessene Skriptsprache aus dem Mainframebereich

Information von Penny.Cilin vor 1 TagBatch & Shell9 Kommentare

Ich kann mich noch sehr gut an diese Skriptsprache erinnern und nutze diese auch heute ab und an noch. ...

Heiß diskutierte Inhalte
Windows Server
Kann man im KMS nachschauen , wieviele Clients den Key in Anspruch genommen haben
gelöst Frage von rainergugusWindows Server15 Kommentare

Hallo, wir haben einen KMS Windows 10 Key. Dieser ist ja W7 kompatibel. Aber unser Windows 7 Pool registriert ...

Linux
Limux-Ende in München: Wie ein Linux Projekt unter Ausschluss der Öffentlichkeit zerstört wurde
Information von FrankLinux14 Kommentare

Mein persönlicher Kommentar zum Thema "Limux-Ende". Die SPD-Politikerin Anne Hübner hat die Richtung von München ganz klar definiert: "Wir ...

Router & Routing
Zwei Netzwerke erstellen
Frage von bunteblumeRouter & Routing14 Kommentare

Hallo Zusammen, Ich möchte gerne ein backup von einem bestimmten Folder welcher auf dem Server regelmässig synchronisiert wird auf ...

Off Topic
Fachkräftemangel in Deutschland? - Talentschmiede schreibt alle 2 Tage die gleichen Stellen aus
Frage von Penny.CilinOff Topic12 Kommentare

Hallo, haben wir in Deutschland Fachkräftemangel? Die Talentschmiede schreibt gefühlt alle zwei Tage dieselben Stellen aus. Und das schon ...