ellomia
Goto Top

Große XML datei in mehrere kleine dateien aufteilen

hallo, ich habe des öfteren hier rum gestöbert und bin oft fündig geworden. jetzt stehe ich vor einem Problem das ich in einer ähnlichen Form schon mal in einer Frage von vor 3 Jahren gestellt wurde. allerdings besitze ich kaum Shell Kenntnisse. daher fällt es mir schwer diese Lösung auf mein Problem um zu münzen.

Eine größere XML Datei soll in kleine Dateien aufgeteilt werden.

Die Originaldatei sieht folgendermaßen aus:

Original Datei heißt File.xml und hat den Inhalt ...
<standart>
........<header>
................<totalItem>70645</totalItem>
................<name>AAAA</name>
................<feld>BBBB</feld>
........</header>
........<datensatz>
................<name>Name1</name>
................<feld1>11111</feld1>
................<feld2>CCCCC</feld2>
................<feld1>22222</feld1>
................<feld2>33333</feld2>
........</datensatz>
......
USW...
......
........<datensatz>
................<name>Name2</name>
................<feld1>44444</feld1>
................<feld2>DDDDD</feld2>
................<feld1>55555</feld1>
................<feld2>66666</feld2>
........</datensatz>
......
USW...
......
........<datensatz>
................<name>Name3</name>
................<feld1>77777</feld1>
................<feld2>EEEEE</feld2>
................<feld1>88888</feld1>
................<feld2>99999</feld2>
........</datensatz>
......
USW...
......
</standart>
Jetzt soll die Datei anhand der Datensätze aufgeteilt werden. Die original Datei hat ca. 70000 Datensätze. Es wäre gut wenn man im Script nun sagen kann: ich hätte nun gerne 500 Datensätze pro Datei. was nun passieren soll ist das all diese Dateien in folgender Form erstellt werden (das Verzeichnis ist dabei egal):


Datei 1 heißt file_0001 und hat den Inhalt ...
<standart>
........<header>
................<totalItem>500</totalItem>
................<name>AAAA</name>
................<feld>BBBB</feld>
........</header>
........<datensatz>
................<name>Name1</name>
................<feld1>11111</feld1>
................<feld2>CCCCC</feld2>
................<feld1>22222</feld1>
................<feld2>33333</feld2>
........</datensatz>
......
USW...insgesamt 500 stück
......
</standart>

Datei 2 heißt file_0002 und hat den Inhalt ...
<standart>
........<header>
................<totalItem>500</totalItem>
................<name>AAAA</name>
................<feld>BBBB</feld>
........</header>
........<datensatz>
................<name>Name1</name>
................<feld1>44444</feld1>
................<feld2>DDDDD</feld2>
................<feld1>55555</feld1>
................<feld2>66666</feld2>
........</datensatz>
......
USW...insgesamt 500 stück
......
</standart>
und so weiter ... bis wir zum letzten kommen. in meinem Beispiel waren es 70645 Datensätze zu jeweils 500 Datensätzen. Heißt das wir am ende 141 Dateien mit 500 Datensätzen haben und eine Datei mit den restlichen 145:

Datei 142 heißt file_0142 und hat den Inhalt ...
<standart>
........<header>
................<totalItem>145</totalItem>
................<name>AAAA</name>
................<feld>BBBB</feld>
........</header>
........<datensatz>
................<name>Name1</name>
................<feld1>77777</feld1>
................<feld2>EEEEE</feld2>
................<feld1>88888</feld1>
................<feld2>99999</feld2>
........</datensatz>
......
USW...letzten 145 stück
......
</standart>
Falls jemand von euch eine Idee hat so wäre ich sehr dankbar. Daher bereits jetzt vielen Dank im Voraus.

gruß Jahush

Content-Key: 195619

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

Printed on: April 24, 2024 at 21:04 o'clock

Member: rubberman
rubberman Dec 10, 2012 at 17:12:22 (UTC)
Goto Top
Hallo Ellomia, willkommen im Forum.

Mit der Codeformatierung des Forums hättest du es einfacher gehabt.

Du suchst vermutlich nach dem XML DOM. Die Frage ist, in welcher Sprache möchtest du das umsetzen?

Grüße
rubberman
Member: TsukiSan
TsukiSan Dec 11, 2012 updated at 03:09:59 (UTC)
Goto Top
Hallo Ellomia,

rubberman hat sicher schon ein schöneres Script vor ihm liegen (wenn die Scriptsprache stimmt), aber ich wollte es mir nicht nehmen lassen eine Möglichkeit in VBS aufzuzeigen:
DIM FSO

Const TrennMarke = "........<datensatz>"  
Const DatenSatzPaket = 500

Set FSO = CreateObject("Scripting.FileSystemObject")  

MeineDaten = Split(FSO.OpenTextFile("file.xml",1).ReadAll,TrennMarke)  

a = 1

For i = 0 to Ubound(MeineDaten)
	For j = 0 to (DatenSatzPaket - 1)
		temp = temp & TrennMarke &  MeineDaten(i + j)
	Next
	i = i + (DatenSatzPaket - 1)

	select case Len(a)
	case 1
		a = "000" & a  
	case 2
		a = "00" & a  
	case 3
		a = "0" & a  
	end select

	FSO.CreateTextFile("File_" & a & "_.xml",true).Write (temp)  
	temp = ""  
	a = a + 1
Next

Set FSO = Nothing

Da du dich ja bedeckt hälst bezüglich OS und Scriptsprache könnten meine paar Zeilen eventuell jemand anderem als Anstoss dienen.

Frohe Vorweihnachtszeit und viele Grüsse

Tsuki
Member: Ellomia
Ellomia Dec 12, 2012 updated at 09:59:55 (UTC)
Goto Top
hallo, danke für die Begrüßung und die flotten antworten.

@rubberman: ich dachte da an ein java oder vbs Script. thx für den codeformater link
also dom könnte von dem was ich bisher gelesen habe auch gut passen.

@TsukiSan: ich bekomme für deinen Code eine " Index außerhalb des gültigen Bereichs:'[number:1]' " Error. Line 14 Char 3. Code 800A0009
da ich kein vbs kann sehe ich den Fehler leider nicht.
Member: TsukiSan
TsukiSan Dec 12, 2012 at 10:26:17 (UTC)
Goto Top
Hallo Ellomia,

füge mal zwischen Zeile 12 und Zeile 13 folgende Zeile ein:
On Error Resume Next

Wenn du unter anderem an ein VBS-Script gedacht hast bei deinem Unterfangen, da wäre jetzt die beste Gelegenheit dazu, sich etwas reinzuarbeiten.

die Fehlermeldung hängt damit zusammen, dass nach einer Array-Adresse gefragt wird, die es nicht gibt (Adresse höher, als die höchst existierende).
Das hängt damit zusammen, dass ich nicht mit einer deiner Dateien testen kann.

Gruss
Tsuki
Member: Ellomia
Ellomia Dec 12, 2012 at 11:10:29 (UTC)
Goto Top
hi TsukiSan,

ich habe deine Korrektur mit eingebunden. allerdings wird dann nur eine Datei erzeugt die dann file_0001.xml heißt.

ich habe die XMl Datei mal genommen und verkürzt um dir den Inhalt mal zu zeigen:

<standard>
     <licenceCompanyHeader>
        <totalItem>2</totalItem>
        <cardSchemeName>AAA</cardSchemeName>
        <updateType>BBB</updateType>
    </licenceCompanyHeader>

    <licenceCompany>
        <name>aaa</name>
        <iso2CountryCode>CC</iso2CountryCode>
        <regionCode>11111</regionCode>
        <memberId>22222</memberId>
        <processingMemberId>33333</processingMemberId>
    </licenceCompany>
    <licenceCompany>
        <name>bbb</name>
        <iso2CountryCode>DD</iso2CountryCode>
        <regionCode>44444</regionCode>
        <memberId>55555</memberId>
        <processingMemberId>66666</processingMemberId>
    </licenceCompany>
</standard>

bei einer größe von 2 sag ich mal das ich einfach 2 einzelne Dateien haben möchte. daher:

file_0001.xml
<standard>
     <licenceCompanyHeader>
        <totalItem>1</totalItem>
        <cardSchemeName>AAA</cardSchemeName>
        <updateType>BBB</updateType>
    </licenceCompanyHeader>

    <licenceCompany>
        <name>aaa</name>
        <iso2CountryCode>CC</iso2CountryCode>
        <regionCode>11111</regionCode>
        <memberId>22222</memberId>
        <processingMemberId>33333</processingMemberId>
    </licenceCompany>
</standard>

file_0002.xml
<standard>
     <licenceCompanyHeader>
        <totalItem>1</totalItem>
        <cardSchemeName>AAA</cardSchemeName>
        <updateType>BBB</updateType>
    </licenceCompanyHeader>

    <licenceCompany>
        <name>bbb</name>
        <iso2CountryCode>DD</iso2CountryCode>
        <regionCode>44444</regionCode>
        <memberId>55555</memberId>
        <processingMemberId>66666</processingMemberId>
    </licenceCompany>
</standard>

man beachte das in dem Header jeder xml Datei ein Feld da ist in dem die Anzahl vorhandener Einträge drin steht. die restlichen Felder des Headers müssen nicht verändert werden.

hoffe das ist nun übersichtlicher formatiert face-smile

gruß Ellomia
Member: TsukiSan
TsukiSan Dec 12, 2012 at 11:22:34 (UTC)
Goto Top
Hallo Ellomia,

ich habe deine Korrektur mit eingebunden. allerdings wird dann nur eine > Datei erzeugt die dann file_0001.xml heißt.

Das habe ich mir gedacht!
Hast du meine paar Zeilen da oben einfach so genommen oder angepasst?
Wenn du etwas angepasst hast, was hast du wie angepasst/geschrieben?

Mir ist schon einigermassen verständlich jetzt, wie deine xml-datein aussehen.
Du benötigst immer die aller erste und letzte Zeile, sowie den Header, welcher dann in allen neu angelegten Datein vorhanden sein muss.

Aber bevor wir das Script "schneidern" müsste ich wissen, wie du die obigen Zeilen abgepasst hast.

Viele Grüsse
Tsuki
Member: Ellomia
Ellomia Dec 12, 2012 at 11:43:58 (UTC)
Goto Top
hi TsukiSan,

danke für die floten antworten. ich habe zwischen zeite 12 und 13 die eine zeile eingebunden. sieht dann so aus:

For i = 0 to Ubound(MeineDaten) 
	On Error Resume Next
	For j = 0 to (DatenSatzPaket - 1) 

und dann habe ich noch oben bei der trennMarke die punkte weg gemacht. sieht dann so aus:

Const TrennMarke = "<datensatz>"   

und das wars an änderungen.

gruß Jahush
Member: TsukiSan
TsukiSan Dec 12, 2012 at 11:48:36 (UTC)
Goto Top
Hallo Ellomia,

danke für das Feedback.
Damit haben sich meine Vermutungen bestätigt und so wird es nicht funktionieren.

Also mache ich folgendes:
1) beid einer letzten Antwort nehme ich diese Datei als Beipiel-Datei
2) die Trennmarke sollte als ganze Zeile eingegeben werden, damit es
funktioniert! In deinem Beispiel wäre das:
<licenceCompany> mit Leerzeichen!!!

Wenn ich es fertig habe, setze ich es hier rein.

Bis später und Grüsse

Tsuki
Member: TsukiSan
TsukiSan Dec 12, 2012 at 12:01:58 (UTC)
Goto Top
So, ich habe den Script angepasst. An deine Beispieldatei!

DIM FSO
Dim Erste_Letzte_Zeile
Dim Vorkopf

Const TrennMarke = "    <licenceCompany>"  
Const DatenSatzPaket = 3

Set FSO = CreateObject("Scripting.FileSystemObject")  

MeineDaten = Split(FSO.OpenTextFile("file.xml",1).ReadAll,TrennMarke)  
	temp = split(MeineDaten(0),vbcrlf)
	Erste_Letzte_Zeile = temp(0) & vbcrlf
	For i = 1 to (Ubound(temp) -1)
		Vorkopf = Vorkopf & temp(i) & vbcrlf
	Next

temp = ""  

a = 1

For i = 1 to Ubound(MeineDaten)
	on error resume next
	For j = 0 to (DatenSatzPaket -1)
		temp = temp & TrennMarke &  MeineDaten(i + j)
	Next
	i = i + (DatenSatzPaket - 1)

	select case Len(a)
	case 1
		a = "000" & a  
	case 2
		a = "00" & a  
	case 3
		a = "0" & a  
	end select

	FSO.CreateTextFile("File_" & a & "_.xml",true).Write (Erste_Letzte_Zeile & Vorkopf & temp & Erste_Letzte_Zeile)  
	temp = ""  
	a = a + 1
Next

Set FSO = Nothing
Die Constante Trennmarke bitte genau so anpassen und in Gänsefüsschen stellen, wie diese auch in der XML-Datei ist. Wenn da Leerzeichen oder Pünktchen o.ä. drinnen sind, dann it einfügen.

Die Constante DatenSatzPaket kannst du nach belieben einstellen. Hier werden immer 3-er Pakete in einer neuen Datei erstellt.

Probier mal.

Viele Grüsse
Tsuki
Member: Ellomia
Ellomia Dec 13, 2012 at 17:51:33 (UTC)
Goto Top
hey, bin leider jetzt erst zum testen gekommen.

also dein Skript erstellt jedenfalls perfekt schon mal die gewünschte Anzahl an neuen XML Dateien. die Anzahl der da drin enthaltenen Datensätzen ist auch richtig. die Struktur auch fast. der äußerste Tag wird am ende eingetragen, aber der sich öffnende nicht der sich schließende. und die zweite Sache ist das danach nochmal der Header geschrieben wird. hier Codebeispiele:

angenommen die Datei die erzeugt worden wäre hätte so aussehen sollen:

<standard>
     <licenceCompanyHeader>
        <totalItem>2</totalItem>
        <cardSchemeName>AAA</cardSchemeName>
        <updateType>BBB</updateType>
    </licenceCompanyHeader>

    <licenceCompany>
        <name>aaa</name>
        <iso2CountryCode>CC</iso2CountryCode>
        <regionCode>11111</regionCode>
        <memberId>22222</memberId>
        <processingMemberId>33333</processingMemberId>
    </licenceCompany>
    <licenceCompany>
        <name>bbb</name>
        <iso2CountryCode>DD</iso2CountryCode>
        <regionCode>44444</regionCode>
        <memberId>55555</memberId>
        <processingMemberId>66666</processingMemberId>
    </licenceCompany>
</standard>

und das ist nun das Resultat deines Skriptes:

<standard>
     <licenceCompanyHeader>
        <totalItem>2</totalItem>
        <cardSchemeName>AAA</cardSchemeName>
        <updateType>BBB</updateType>
    </licenceCompanyHeader>

    <licenceCompany>
        <name>aaa</name>
        <iso2CountryCode>CC</iso2CountryCode>
        <regionCode>11111</regionCode>
        <memberId>22222</memberId>
        <processingMemberId>33333</processingMemberId>
    </licenceCompany>
    <licenceCompany>
        <name>bbb</name>
        <iso2CountryCode>DD</iso2CountryCode>
        <regionCode>44444</regionCode>
        <memberId>55555</memberId>
        <processingMemberId>66666</processingMemberId>
    </licenceCompany>
<standard>
     <licenceCompanyHeader>
        <totalItem>2</totalItem>
        <cardSchemeName>AAA</cardSchemeName>
        <updateType>BBB</updateType>
    </licenceCompanyHeader>

sprich am ende müsste der Header weg und der Tag <standart> unten müsste ein sich schließender sein. ansonsten sieht es echt super aus was da raus kommt. das in dem Header Feld <totalItem> nicht die Anzahl der beinhaltenden Datensätze ist ist dabei gar nicht mal so tragisch^^ müsste die zahl theoretisch nur bei der letzten anpassen. und das kann ich auch manuell machen.

fällt dir noch was ein wie man das mit dem schließenden Tag und dem Header am fuße lösen kann?

Gruß Ellomia
Member: bastla
bastla Dec 13, 2012 updated at 18:41:24 (UTC)
Goto Top
Hallo Tsuki!

Detail am Rande: Bei aller vorweihnachtlichen Großzügigkeit face-wink sollte es anstatt
        select case Len(a)
	case 1
		a = "000" & a  
	case 2
		a = "00" & a  
	case 3
		a = "0" & a  
	end select
auch einfach
a = Right("000" & a, 4)
tun (wobei ich das gar nicht erst der Variablen zuweisen, sondern gleich unmittelbar in das "Zusammenbauen" des Dateinamens integrieren würde) ...

Eine (vor allem in Batch übliche) Alternative würde übrigens einfach mit einer Zählung ab 10001 beginnen und dann ebenfalls jeweils die letzten 4 Stellen verwenden.

Grüße
bastla
Member: TsukiSan
TsukiSan Dec 14, 2012 at 01:45:38 (UTC)
Goto Top
Hallo Ellomia,

also bei mir sieht es - wenn ich eine grosse Testdatei erzeuge nach deinen Vorgaben - richtig aus. Ich habe in keinem Fall die situation, dass der Header als Fooder kommt, sprich unten angehangen wird. So ist das Script auch gar nicht geschrieben (siehe Zeile 37).
Meine Beispieldatei:
<standard>
<licenceCompanyHeader>
<totalItem>2</totalItem>
<cardSchemeName>AAA</cardSchemeName>
<updateType>BBB</updateType>
</licenceCompanyHeader>

<licenceCompany>
<name>aaa</name1>
<iso2CountryCode>CC</iso2CountryCode>
<regionCode>11111</regionCode>
<memberId>22222</memberId>
<processingMemberId>33333</processingMemberId>
</licenceCompany>
<licenceCompany>
<name>bbb</name2>
<iso2CountryCode>DD</iso2CountryCode>
<regionCode>44444</regionCode>
<memberId>55555</memberId>
<processingMemberId>66666</processingMemberId>
</licenceCompany>
<licenceCompany>
<name>aaa</name3>
<iso2CountryCode>CC</iso2CountryCode>
<regionCode>11111</regionCode>
<memberId>22222</memberId>
<processingMemberId>33333</processingMemberId>
</licenceCompany>
<licenceCompany>
<name>bbb</name4>
<iso2CountryCode>DD</iso2CountryCode>
<regionCode>44444</regionCode>
<memberId>55555</memberId>
<processingMemberId>66666</processingMemberId>
</licenceCompany>
<licenceCompany>
<name>aaa</name5>
<iso2CountryCode>CC</iso2CountryCode>
<regionCode>11111</regionCode>
<memberId>22222</memberId>
<processingMemberId>33333</processingMemberId>
</licenceCompany>
<licenceCompany>
<name>bbb</name6>
<iso2CountryCode>DD</iso2CountryCode>
<regionCode>44444</regionCode>
<memberId>55555</memberId>
<processingMemberId>66666</processingMemberId>
</licenceCompany>
<licenceCompany>
<name>aaa</name7>
<iso2CountryCode>CC</iso2CountryCode>
<regionCode>11111</regionCode>
<memberId>22222</memberId>
<processingMemberId>33333</processingMemberId>
</licenceCompany>
<licenceCompany>
<name>bbb</name8>
<iso2CountryCode>DD</iso2CountryCode>
<regionCode>44444</regionCode>
<memberId>55555</memberId>
<processingMemberId>66666</processingMemberId>
</licenceCompany>
<licenceCompany>
<name>aaa</name9>
<iso2CountryCode>CC</iso2CountryCode>
<regionCode>11111</regionCode>
<memberId>22222</memberId>
<processingMemberId>33333</processingMemberId>
</licenceCompany>
<licenceCompany>
<name>bbb</name10>
<iso2CountryCode>DD</iso2CountryCode>
<regionCode>44444</regionCode>
<memberId>55555</memberId>
<processingMemberId>66666</processingMemberId>
</licenceCompany>
<licenceCompany>
<name>aaa</name11>
<iso2CountryCode>CC</iso2CountryCode>
<regionCode>11111</regionCode>
<memberId>22222</memberId>
<processingMemberId>33333</processingMemberId>
</licenceCompany>
<licenceCompany>
<name>bbb</name12>
<iso2CountryCode>DD</iso2CountryCode>
<regionCode>44444</regionCode>
<memberId>55555</memberId>
<processingMemberId>66666</processingMemberId>
</licenceCompany>
<licenceCompany>
<name>aaa</name13>
<iso2CountryCode>CC</iso2CountryCode>
<regionCode>11111</regionCode>
<memberId>22222</memberId>
<processingMemberId>33333</processingMemberId>
</licenceCompany>
<licenceCompany>
<name>bbb</name14>
<iso2CountryCode>DD</iso2CountryCode>
<regionCode>44444</regionCode>
<memberId>55555</memberId>
<processingMemberId>66666</processingMemberId>
</licenceCompany>
<licenceCompany>
<name>aaa</name15>
<iso2CountryCode>CC</iso2CountryCode>
<regionCode>11111</regionCode>
<memberId>22222</memberId>
<processingMemberId>33333</processingMemberId>
</licenceCompany>
<licenceCompany>
<name>bbb</name16>
<iso2CountryCode>DD</iso2CountryCode>
<regionCode>44444</regionCode>
<memberId>55555</memberId>
<processingMemberId>66666</processingMemberId>
</licenceCompany>
</standard>


@bastla
deine Variante sieht besser/sauberer aus. Ich fande nur,dass es eventuell etwas verständlicher für den TO ist, den Script nachzuvollziehen.
Übrigens finde ich meine Select Case - Variante interessant, weil Select-Case und VBS mit mathematischen Vergleichen sind nicht wirklich die dicksten Freunde face-wink

Vorweihnachtliche Grüsse

Tsuki
Member: Ellomia
Ellomia Dec 17, 2012 at 13:13:20 (UTC)
Goto Top
hi.

ich hab es mehrfach probiert und bei mir wird immer der header unten dran gehangen. und unten fehlt halt auch der sich schließende tag. keine ahnung wieso es so rauskommt face-sad

hab auch mal deinen input genommen, den du da oben gepostet hast, um sicher zu gehen, aber bei dem bekomme ich es auch raus. keine ahnung woran das iegen könnte.

könntest du mri vlt bite erklären was die zeile "FSO.CreateTextFile("File_" & a & "_.xml",true).Write (Erste_Letzte_Zeile & Vorkopf & temp & Erste_Letzte_Zeile) " macht? vlt versteh ich es dann bissl mehr

mfg
Member: TsukiSan
TsukiSan Dec 17, 2012 at 13:41:54 (UTC)
Goto Top
Hallo Ellomia,

ich verstehe es nicht, aber gut, vielleicht habe ich auch eine andere Beispieldatei.
Hier die Erklärung zur Zeile, in der die neue(n) Datei(n) erstellt werden:
FSO.CreateTextFile("File_" & a & "_.xml",true).Write (Erste_Letzte_Zeile & Vorkopf & temp & Erste_Letzte_Zeile)
Wenn wir weiter "oben" im Script schauen dann werden feste Daten zugewiesen.
1) Erste_Letzte_Zeile = temp(0) & vbcrlf
im temp(0)-array müsste die allererste Zeile <standard> stehen und nichts anderes, da die gesamte Datei eingelesen wird und nach Zeilenumbrüchen getrennt wird.
2) in den Zeilen 13 bis 15 werden die Daten in den Header (Vorkopf) geschrieben)
Vorkopf = Vorkopf & temp(i) & vbcrlf
Da müssten dann nur folgende Zeilen drinnen zu finden sein:
<licenceCompanyHeader>
<totalItem>2</totalItem>
<cardSchemeName>AAA</cardSchemeName>
<updateType>BBB</updateType>
</licenceCompanyHeader>
3) in temp stehen jetzt nur die Datenblöcke drinnen, die wir aus der Gesamtdatei extrahiert haben.
4) und dann kommt wieder die Zeile Erste_Letzte_Zeile

Wenn wir das jetzt zusammensetzen müssten die neuen Dateien immer so aufgebaut sein:
<standard>
<licenceCompanyHeader>
<totalItem>2</totalItem>
<cardSchemeName>AAA</cardSchemeName>
<updateType>BBB</updateType>
</licenceCompanyHeader>

Datenblock/Datenblöcke
<standard>

Das aber nur, wenn deine grossen Dateien so aufgebaut sind, wie du es beschrieben hast.
Also so hier:
<standard>
<licenceCompanyHeader>
<totalItem>2</totalItem>
<cardSchemeName>AAA</cardSchemeName>
<updateType>BBB</updateType>
</licenceCompanyHeader>

<licenceCompany>
<name>aaa</name>
<iso2CountryCode>CC</iso2CountryCode>
<regionCode>11111</regionCode>
<memberId>22222</memberId>
<processingMemberId>33333</processingMemberId>
</licenceCompany>
<licenceCompany>
<name>bbb</name>
<iso2CountryCode>DD</iso2CountryCode>
<regionCode>44444</regionCode>
<memberId>55555</memberId>
<processingMemberId>66666</processingMemberId>
</licenceCompany>
</standard>

Gruss
Tsuki
Member: TsukiSan
TsukiSan Dec 17, 2012 at 13:55:57 (UTC)
Goto Top
Also ich möchte es nochmals aufzeichnen.
Gegeben: eine grosse Datei mit sehr vielen Einträgen (Datenblöcken), die in der aller ersten und aller letzten Zeile immer gleich ist, einen Vorkopf (Header) besitzt und dann in Datenblöcke unterteilt ist:
<standard>
     <licenceCompanyHeader>
        <totalItem>2</totalItem>
        <cardSchemeName>AAA</cardSchemeName>
        <updateType>BBB</updateType>
    </licenceCompanyHeader>

    <licenceCompany>
        <name>aaa</name>
        <iso2CountryCode>CC</iso2CountryCode>
        <regionCode>11111</regionCode>
        <memberId>22222</memberId>
        <processingMemberId>33333</processingMemberId>
    </licenceCompany>
    <licenceCompany>
        <name>bbb</name>
        <iso2CountryCode>DD</iso2CountryCode>
        <regionCode>44444</regionCode>
        <memberId>55555</memberId>
        <processingMemberId>66666</processingMemberId>
    </licenceCompany>
</standard>

Wenn ich diese dann mit diesem Script öffne und unter DatenSatzPaket eine 1 eingebe:
DIM FSO
Dim Erste_Letzte_Zeile
Dim Vorkopf

Const TrennMarke = "    <licenceCompany>"  
Const DatenSatzPaket = 3

Set FSO = CreateObject("Scripting.FileSystemObject")  

MeineDaten = Split(FSO.OpenTextFile("file.xml",1).ReadAll,TrennMarke)  
	temp = split(MeineDaten(0),vbcrlf)
	Erste_Letzte_Zeile = temp(0) & vbcrlf
	For i = 1 to (Ubound(temp) -1)
		Vorkopf = Vorkopf & temp(i) & vbcrlf
	Next

temp = ""  

a = 1

For i = 1 to Ubound(MeineDaten)
	on error resume next
	For j = 0 to (DatenSatzPaket -1)
		temp = temp & TrennMarke &  MeineDaten(i + j)
	Next
	i = i + (DatenSatzPaket - 1)

	select case Len(a)
	case 1
		a = "000" & a  
	case 2
		a = "00" & a  
	case 3
		a = "0" & a  
	end select

	FSO.CreateTextFile("File_" & a & "_.xml",true).Write (Erste_Letzte_Zeile & Vorkopf & temp & Erste_Letzte_Zeile)  
	temp = ""  
	a = a + 1
Next

Set FSO = Nothing

dann kommt bei mir als Ergebnis:
<standard>
     <licenceCompanyHeader>
        <totalItem>2</totalItem>
        <cardSchemeName>AAA</cardSchemeName>
        <updateType>BBB</updateType>
    </licenceCompanyHeader>

    <licenceCompany>
        <name>aaa</name>
        <iso2CountryCode>CC</iso2CountryCode>
        <regionCode>11111</regionCode>
        <memberId>22222</memberId>
        <processingMemberId>33333</processingMemberId>
    </licenceCompany>
<standard>

raus. Wenn ich die Beispieldatei um beliebe viele Blöcke vergrössere:
    <licenceCompany>
        <name>aaa</name>
        <iso2CountryCode>CC</iso2CountryCode>
        <regionCode>11111</regionCode>
        <memberId>22222</memberId>
        <processingMemberId>33333</processingMemberId>
    </licenceCompany>

dann bekomme ich ganz viele einzelne, kleinere Dateien raus, die alle so aufgebaut sind.

Gruss
Tsuki
Member: Ellomia
Ellomia Dec 20, 2012 at 17:46:40 (UTC)
Goto Top
hey. bin gerade wegen meiner Bachelorarbeit im Stress, und das hier mache ich immer nur ein bisschen nebenbei^^
also sry fürs lange warten.

also du hast ja im letzten Beitrag deinen Output gepostet. bei dir scheint zwar der Header Fehler nicht aufzutauchen, aber du hast trotzdem am ende einen sich öffnenden tag statt eines sich schließenden tags (<standard> statt </standard>)

wegen dem Header werde ich bei Gelegenheit eine Beispiel Datei nach deinem oben erwähntem Muster erzeugen und das dann mal mit genau der probieren.

gruss Jahush
Member: TsukiSan
TsukiSan Jan 07, 2013 at 05:00:05 (UTC)
Goto Top
Hallo Ellomia,

viel Glück für 2013 bei all deinen Belangen!

Entschuldige meine späte Antwort. Der Urlaub ist gerade zu Ende.

Wenn in der letzten Zeile einer neu erstellten Datei nur der SLASH raus soll, dann würde ich die Zeile 37 von meinem letzten Script quick'n'dirty so ändern:
FSO.CreateTextFile("File_" & a & "_.xml",true).Write (Erste_Letzte_Zeile & Vorkopf & temp & Replace(Erste_Letzte_Zeile,"/",""))   

Hoffe es hilft.

Viele Grüsse

Tsuki