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 ...
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 ...
Datei 2 heißt file_0002 und hat den Inhalt ...
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 ...
Falls jemand von euch eine Idee hat so wäre ich sehr dankbar. Daher bereits jetzt vielen Dank im Voraus.
gruß Jahush
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>
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>
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>
gruß Jahush
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 195619
Url: https://administrator.de/forum/grosse-xml-datei-in-mehrere-kleine-dateien-aufteilen-195619.html
Ausgedruckt am: 18.04.2025 um 08:04 Uhr
17 Kommentare
Neuester Kommentar
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
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
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:
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
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
Hallo Ellomia,
füge mal zwischen Zeile 12 und Zeile 13 folgende Zeile ein:
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
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
Hallo Ellomia,
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
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
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
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
So, ich habe den Script angepasst. An deine Beispieldatei!
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
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 DatenSatzPaket kannst du nach belieben einstellen. Hier werden immer 3-er Pakete in einer neuen Datei erstellt.
Probier mal.
Viele Grüsse
Tsuki
Hallo Tsuki!
Detail am Rande: Bei aller vorweihnachtlichen Großzügigkeit
sollte es anstatt
auch einfach
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
Detail am Rande: Bei aller vorweihnachtlichen Großzügigkeit
select case Len(a)
case 1
a = "000" & a
case 2
a = "00" & a
case 3
a = "0" & a
end select
a = Right("000" & a, 4)
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
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
Vorweihnachtliche Grüsse
Tsuki
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
Vorweihnachtliche Grüsse
Tsuki
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:
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
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
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:
Wenn ich diese dann mit diesem Script öffne und unter DatenSatzPaket eine 1 eingebe:
dann kommt bei mir als Ergebnis:
raus. Wenn ich die Beispieldatei um beliebe viele Blöcke vergrössere:
dann bekomme ich ganz viele einzelne, kleinere Dateien raus, die alle so aufgebaut sind.
Gruss
Tsuki
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
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:
Hoffe es hilft.
Viele Grüsse
Tsuki
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