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

Große XML datei in mehrere kleine dateien aufteilen

Frage Entwicklung Batch & Shell

Mitglied: Ellomia

Ellomia (Level 1) - Jetzt verbinden

10.12.2012, aktualisiert 12.12.2012, 2444 Aufrufe, 17 Kommentare

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 ...
01.
<standart> 
02.
........<header> 
03.
................<totalItem>70645</totalItem> 
04.
................<name>AAAA</name> 
05.
................<feld>BBBB</feld> 
06.
........</header> 
07.
........<datensatz> 
08.
................<name>Name1</name> 
09.
................<feld1>11111</feld1> 
10.
................<feld2>CCCCC</feld2> 
11.
................<feld1>22222</feld1> 
12.
................<feld2>33333</feld2> 
13.
........</datensatz> 
14.
...... 
15.
USW... 
16.
...... 
17.
........<datensatz> 
18.
................<name>Name2</name> 
19.
................<feld1>44444</feld1> 
20.
................<feld2>DDDDD</feld2> 
21.
................<feld1>55555</feld1> 
22.
................<feld2>66666</feld2> 
23.
........</datensatz> 
24.
...... 
25.
USW... 
26.
...... 
27.
........<datensatz> 
28.
................<name>Name3</name> 
29.
................<feld1>77777</feld1> 
30.
................<feld2>EEEEE</feld2> 
31.
................<feld1>88888</feld1> 
32.
................<feld2>99999</feld2> 
33.
........</datensatz> 
34.
...... 
35.
USW... 
36.
...... 
37.
</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 ...
01.
<standart> 
02.
........<header> 
03.
................<totalItem>500</totalItem> 
04.
................<name>AAAA</name> 
05.
................<feld>BBBB</feld> 
06.
........</header> 
07.
........<datensatz> 
08.
................<name>Name1</name> 
09.
................<feld1>11111</feld1> 
10.
................<feld2>CCCCC</feld2> 
11.
................<feld1>22222</feld1> 
12.
................<feld2>33333</feld2> 
13.
........</datensatz> 
14.
...... 
15.
USW...insgesamt 500 stück 
16.
...... 
17.
</standart>
Datei 2 heißt file_0002 und hat den Inhalt ...
01.
<standart> 
02.
........<header> 
03.
................<totalItem>500</totalItem> 
04.
................<name>AAAA</name> 
05.
................<feld>BBBB</feld> 
06.
........</header> 
07.
........<datensatz> 
08.
................<name>Name1</name> 
09.
................<feld1>44444</feld1> 
10.
................<feld2>DDDDD</feld2> 
11.
................<feld1>55555</feld1> 
12.
................<feld2>66666</feld2> 
13.
........</datensatz> 
14.
...... 
15.
USW...insgesamt 500 stück 
16.
...... 
17.
</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 ...
01.
<standart> 
02.
........<header> 
03.
................<totalItem>145</totalItem> 
04.
................<name>AAAA</name> 
05.
................<feld>BBBB</feld> 
06.
........</header> 
07.
........<datensatz> 
08.
................<name>Name1</name> 
09.
................<feld1>77777</feld1> 
10.
................<feld2>EEEEE</feld2> 
11.
................<feld1>88888</feld1> 
12.
................<feld2>99999</feld2> 
13.
........</datensatz> 
14.
...... 
15.
USW...letzten 145 stück 
16.
...... 
17.
</standart>
Falls jemand von euch eine Idee hat so wäre ich sehr dankbar. Daher bereits jetzt vielen Dank im Voraus.

gruß Jahush
Mitglied: rubberman
10.12.2012 um 18:12 Uhr
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
Bitte warten ..
Mitglied: TsukiSan
11.12.2012, aktualisiert um 04:09 Uhr
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:
01.
DIM FSO 
02.
 
03.
Const TrennMarke = "........<datensatz>" 
04.
Const DatenSatzPaket = 500 
05.
 
06.
Set FSO = CreateObject("Scripting.FileSystemObject") 
07.
 
08.
MeineDaten = Split(FSO.OpenTextFile("file.xml",1).ReadAll,TrennMarke) 
09.
 
10.
a = 1 
11.
 
12.
For i = 0 to Ubound(MeineDaten) 
13.
	For j = 0 to (DatenSatzPaket - 1) 
14.
		temp = temp & TrennMarke &  MeineDaten(i + j) 
15.
	Next 
16.
	i = i + (DatenSatzPaket - 1) 
17.
 
18.
	select case Len(a) 
19.
	case 1 
20.
		a = "000" & a 
21.
	case 2 
22.
		a = "00" & a 
23.
	case 3 
24.
		a = "0" & a 
25.
	end select 
26.
 
27.
	FSO.CreateTextFile("File_" & a & "_.xml",true).Write (temp) 
28.
	temp = "" 
29.
	a = a + 1 
30.
Next 
31.
 
32.
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
Bitte warten ..
Mitglied: Ellomia
12.12.2012, aktualisiert um 10:59 Uhr
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.
Bitte warten ..
Mitglied: TsukiSan
12.12.2012 um 11:26 Uhr
Hallo Ellomia,

füge mal zwischen Zeile 12 und Zeile 13 folgende Zeile ein:
01.
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
Bitte warten ..
Mitglied: Ellomia
12.12.2012 um 12:10 Uhr
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:

01.
<standard> 
02.
     <licenceCompanyHeader> 
03.
        <totalItem>2</totalItem> 
04.
        <cardSchemeName>AAA</cardSchemeName> 
05.
        <updateType>BBB</updateType> 
06.
    </licenceCompanyHeader> 
07.
 
08.
    <licenceCompany> 
09.
        <name>aaa</name> 
10.
        <iso2CountryCode>CC</iso2CountryCode> 
11.
        <regionCode>11111</regionCode> 
12.
        <memberId>22222</memberId> 
13.
        <processingMemberId>33333</processingMemberId> 
14.
    </licenceCompany> 
15.
    <licenceCompany> 
16.
        <name>bbb</name> 
17.
        <iso2CountryCode>DD</iso2CountryCode> 
18.
        <regionCode>44444</regionCode> 
19.
        <memberId>55555</memberId> 
20.
        <processingMemberId>66666</processingMemberId> 
21.
    </licenceCompany> 
22.
</standard>
bei einer größe von 2 sag ich mal das ich einfach 2 einzelne Dateien haben möchte. daher:

file_0001.xml
01.
<standard> 
02.
     <licenceCompanyHeader> 
03.
        <totalItem>1</totalItem> 
04.
        <cardSchemeName>AAA</cardSchemeName> 
05.
        <updateType>BBB</updateType> 
06.
    </licenceCompanyHeader> 
07.
 
08.
    <licenceCompany> 
09.
        <name>aaa</name> 
10.
        <iso2CountryCode>CC</iso2CountryCode> 
11.
        <regionCode>11111</regionCode> 
12.
        <memberId>22222</memberId> 
13.
        <processingMemberId>33333</processingMemberId> 
14.
    </licenceCompany> 
15.
</standard>
file_0002.xml
01.
<standard> 
02.
     <licenceCompanyHeader> 
03.
        <totalItem>1</totalItem> 
04.
        <cardSchemeName>AAA</cardSchemeName> 
05.
        <updateType>BBB</updateType> 
06.
    </licenceCompanyHeader> 
07.
 
08.
    <licenceCompany> 
09.
        <name>bbb</name> 
10.
        <iso2CountryCode>DD</iso2CountryCode> 
11.
        <regionCode>44444</regionCode> 
12.
        <memberId>55555</memberId> 
13.
        <processingMemberId>66666</processingMemberId> 
14.
    </licenceCompany> 
15.
</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

gruß Ellomia
Bitte warten ..
Mitglied: TsukiSan
12.12.2012 um 12:22 Uhr
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
Bitte warten ..
Mitglied: Ellomia
12.12.2012 um 12:43 Uhr
hi TsukiSan,

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

01.
For i = 0 to Ubound(MeineDaten)  
02.
	On Error Resume Next 
03.
	For j = 0 to (DatenSatzPaket - 1) 
und dann habe ich noch oben bei der trennMarke die punkte weg gemacht. sieht dann so aus:

01.
Const TrennMarke = "<datensatz>" 
und das wars an änderungen.

gruß Jahush
Bitte warten ..
Mitglied: TsukiSan
12.12.2012 um 12:48 Uhr
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
Bitte warten ..
Mitglied: TsukiSan
12.12.2012 um 13:01 Uhr
So, ich habe den Script angepasst. An deine Beispieldatei!

01.
DIM FSO 
02.
Dim Erste_Letzte_Zeile 
03.
Dim Vorkopf 
04.
 
05.
Const TrennMarke = "    <licenceCompany>" 
06.
Const DatenSatzPaket = 3 
07.
 
08.
Set FSO = CreateObject("Scripting.FileSystemObject") 
09.
 
10.
MeineDaten = Split(FSO.OpenTextFile("file.xml",1).ReadAll,TrennMarke) 
11.
	temp = split(MeineDaten(0),vbcrlf) 
12.
	Erste_Letzte_Zeile = temp(0) & vbcrlf 
13.
	For i = 1 to (Ubound(temp) -1) 
14.
		Vorkopf = Vorkopf & temp(i) & vbcrlf 
15.
	Next 
16.
 
17.
temp = "" 
18.
 
19.
a = 1 
20.
 
21.
For i = 1 to Ubound(MeineDaten) 
22.
	on error resume next 
23.
	For j = 0 to (DatenSatzPaket -1) 
24.
		temp = temp & TrennMarke &  MeineDaten(i + j) 
25.
	Next 
26.
	i = i + (DatenSatzPaket - 1) 
27.
 
28.
	select case Len(a) 
29.
	case 1 
30.
		a = "000" & a 
31.
	case 2 
32.
		a = "00" & a 
33.
	case 3 
34.
		a = "0" & a 
35.
	end select 
36.
 
37.
	FSO.CreateTextFile("File_" & a & "_.xml",true).Write (Erste_Letzte_Zeile & Vorkopf & temp & Erste_Letzte_Zeile) 
38.
	temp = "" 
39.
	a = a + 1 
40.
Next 
41.
 
42.
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
Bitte warten ..
Mitglied: Ellomia
13.12.2012 um 18:51 Uhr
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:

01.
<standard> 
02.
     <licenceCompanyHeader> 
03.
        <totalItem>2</totalItem> 
04.
        <cardSchemeName>AAA</cardSchemeName> 
05.
        <updateType>BBB</updateType> 
06.
    </licenceCompanyHeader> 
07.
 
08.
    <licenceCompany> 
09.
        <name>aaa</name> 
10.
        <iso2CountryCode>CC</iso2CountryCode> 
11.
        <regionCode>11111</regionCode> 
12.
        <memberId>22222</memberId> 
13.
        <processingMemberId>33333</processingMemberId> 
14.
    </licenceCompany> 
15.
    <licenceCompany> 
16.
        <name>bbb</name> 
17.
        <iso2CountryCode>DD</iso2CountryCode> 
18.
        <regionCode>44444</regionCode> 
19.
        <memberId>55555</memberId> 
20.
        <processingMemberId>66666</processingMemberId> 
21.
    </licenceCompany> 
22.
</standard>
und das ist nun das Resultat deines Skriptes:

01.
<standard> 
02.
     <licenceCompanyHeader> 
03.
        <totalItem>2</totalItem> 
04.
        <cardSchemeName>AAA</cardSchemeName> 
05.
        <updateType>BBB</updateType> 
06.
    </licenceCompanyHeader> 
07.
 
08.
    <licenceCompany> 
09.
        <name>aaa</name> 
10.
        <iso2CountryCode>CC</iso2CountryCode> 
11.
        <regionCode>11111</regionCode> 
12.
        <memberId>22222</memberId> 
13.
        <processingMemberId>33333</processingMemberId> 
14.
    </licenceCompany> 
15.
    <licenceCompany> 
16.
        <name>bbb</name> 
17.
        <iso2CountryCode>DD</iso2CountryCode> 
18.
        <regionCode>44444</regionCode> 
19.
        <memberId>55555</memberId> 
20.
        <processingMemberId>66666</processingMemberId> 
21.
    </licenceCompany> 
22.
<standard> 
23.
     <licenceCompanyHeader> 
24.
        <totalItem>2</totalItem> 
25.
        <cardSchemeName>AAA</cardSchemeName> 
26.
        <updateType>BBB</updateType> 
27.
    </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
Bitte warten ..
Mitglied: bastla
13.12.2012, aktualisiert um 19:41 Uhr
Hallo Tsuki!

Detail am Rande: Bei aller vorweihnachtlichen Großzügigkeit sollte es anstatt
01.
        select case Len(a) 
02.
	case 1 
03.
		a = "000" & a 
04.
	case 2 
05.
		a = "00" & a 
06.
	case 3 
07.
		a = "0" & a 
08.
	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
Bitte warten ..
Mitglied: TsukiSan
14.12.2012 um 02:45 Uhr
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
Bitte warten ..
Mitglied: Ellomia
17.12.2012 um 14:13 Uhr
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

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

Mit freundlichen Grüßen
Bitte warten ..
Mitglied: TsukiSan
17.12.2012 um 14:41 Uhr
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
Bitte warten ..
Mitglied: TsukiSan
17.12.2012 um 14:55 Uhr
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:
01.
<standard> 
02.
     <licenceCompanyHeader> 
03.
        <totalItem>2</totalItem> 
04.
        <cardSchemeName>AAA</cardSchemeName> 
05.
        <updateType>BBB</updateType> 
06.
    </licenceCompanyHeader> 
07.
 
08.
    <licenceCompany> 
09.
        <name>aaa</name> 
10.
        <iso2CountryCode>CC</iso2CountryCode> 
11.
        <regionCode>11111</regionCode> 
12.
        <memberId>22222</memberId> 
13.
        <processingMemberId>33333</processingMemberId> 
14.
    </licenceCompany> 
15.
    <licenceCompany> 
16.
        <name>bbb</name> 
17.
        <iso2CountryCode>DD</iso2CountryCode> 
18.
        <regionCode>44444</regionCode> 
19.
        <memberId>55555</memberId> 
20.
        <processingMemberId>66666</processingMemberId> 
21.
    </licenceCompany> 
22.
</standard>
Wenn ich diese dann mit diesem Script öffne und unter DatenSatzPaket eine 1 eingebe:
01.
DIM FSO 
02.
Dim Erste_Letzte_Zeile 
03.
Dim Vorkopf 
04.
 
05.
Const TrennMarke = "    <licenceCompany>" 
06.
Const DatenSatzPaket = 3 
07.
 
08.
Set FSO = CreateObject("Scripting.FileSystemObject") 
09.
 
10.
MeineDaten = Split(FSO.OpenTextFile("file.xml",1).ReadAll,TrennMarke) 
11.
	temp = split(MeineDaten(0),vbcrlf) 
12.
	Erste_Letzte_Zeile = temp(0) & vbcrlf 
13.
	For i = 1 to (Ubound(temp) -1) 
14.
		Vorkopf = Vorkopf & temp(i) & vbcrlf 
15.
	Next 
16.
 
17.
temp = "" 
18.
 
19.
a = 1 
20.
 
21.
For i = 1 to Ubound(MeineDaten) 
22.
	on error resume next 
23.
	For j = 0 to (DatenSatzPaket -1) 
24.
		temp = temp & TrennMarke &  MeineDaten(i + j) 
25.
	Next 
26.
	i = i + (DatenSatzPaket - 1) 
27.
 
28.
	select case Len(a) 
29.
	case 1 
30.
		a = "000" & a 
31.
	case 2 
32.
		a = "00" & a 
33.
	case 3 
34.
		a = "0" & a 
35.
	end select 
36.
 
37.
	FSO.CreateTextFile("File_" & a & "_.xml",true).Write (Erste_Letzte_Zeile & Vorkopf & temp & Erste_Letzte_Zeile) 
38.
	temp = "" 
39.
	a = a + 1 
40.
Next 
41.
 
42.
Set FSO = Nothing
dann kommt bei mir als Ergebnis:
01.
<standard> 
02.
     <licenceCompanyHeader> 
03.
        <totalItem>2</totalItem> 
04.
        <cardSchemeName>AAA</cardSchemeName> 
05.
        <updateType>BBB</updateType> 
06.
    </licenceCompanyHeader> 
07.
 
08.
    <licenceCompany> 
09.
        <name>aaa</name> 
10.
        <iso2CountryCode>CC</iso2CountryCode> 
11.
        <regionCode>11111</regionCode> 
12.
        <memberId>22222</memberId> 
13.
        <processingMemberId>33333</processingMemberId> 
14.
    </licenceCompany> 
15.
<standard>
raus. Wenn ich die Beispieldatei um beliebe viele Blöcke vergrössere:
01.
    <licenceCompany> 
02.
        <name>aaa</name> 
03.
        <iso2CountryCode>CC</iso2CountryCode> 
04.
        <regionCode>11111</regionCode> 
05.
        <memberId>22222</memberId> 
06.
        <processingMemberId>33333</processingMemberId> 
07.
    </licenceCompany>
dann bekomme ich ganz viele einzelne, kleinere Dateien raus, die alle so aufgebaut sind.

Gruss
Tsuki
Bitte warten ..
Mitglied: Ellomia
20.12.2012 um 18:46 Uhr
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
Bitte warten ..
Mitglied: TsukiSan
07.01.2013 um 06:00 Uhr
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:
01.
FSO.CreateTextFile("File_" & a & "_.xml",true).Write (Erste_Letzte_Zeile & Vorkopf & temp & Replace(Erste_Letzte_Zeile,"/","")) 
Hoffe es hilft.

Viele Grüsse

Tsuki
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
Mehrere.csv Dateien zusammenfügen zu einer Datei mit bat (4)

Frage von Piotrney zum Thema Batch & Shell ...

Batch & Shell
gelöst XML-Datei: Pfade suchen, verlinkte Dateien kopieren und Pfade ändern (4)

Frage von ELEVATOR zum Thema Batch & Shell ...

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 ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (24)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...