Hi, ich kenne die letzte zeile, allerdings kann ich nicht einfach durch 4 rechnen, da die Datei muss mit record beginnen und enden.
Die Dateien müssen nicht gleich groß sein.
Die Datei habe ich mit 010 editor geöffnet, aber man kann nicht so markieren, wie man möchte, da die Datei groß ist und sie springt von einem zu anderen Punkt.
Ich versuche einen Script zu schreiben, oder?
Announcement
Collapse
No announcement yet.
XML Datei zerlegen
Collapse
This topic is closed.
X
X
-
Ich kenne kein Tool, welches die Aufgabe erledigen könnte, zumal erstmal festgestellt werden müsste, wie groß "4" ist.
Auch würde ich davon ausgehen, dass 8 GB nicht unbedingt auf einmal gelesen werden können
Programmieren:
Quelldatei öffnen und nur die Zeilen einlesen un dabei zählen.
Anzahl duch 4 teilen
Zieldatei anlegen, XML Header und Rootelement schreiben
Quelldatei öffnen und die Zeilen einlesen, in die Zieldatei kopieren
Ist man an der durch 4 geteilten Anzahl und ein /record Element ist da, dann schreiben in diese Datei beenden (Endeelement schreibeb) und neue anfangen.
Ansonsten noch soweit lesen und kopieren bis das /record Element kommt
Zuletzt editiert von Christian Marquardt; 01.10.2019, 12:40.
Leave a comment:
-
Originally posted by Anna85 View PostHallo, ja ich möchte dieser Datei in 4 Dateien mit derselben Struktur aufteilen. Die records haben keine ids, deshalb kann ich auch nicht sagen von bis....
Ein Tool, um solche Aufgaben zu erledigen, ist XSLT 3 mit Unterstützung für "Streaming", da dabei solch große Dateien nur einmal gelesen werden. Ein generisches, passendes XSLT 3 Programm wäre:
Code:<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="#all" version="3.0"> <xsl:param name="chunk-size" as="xs:integer" select="500"/> <xsl:mode streamable="yes"/> <xsl:output indent="yes"/> <xsl:template match="/*"> <xsl:for-each-group select="*" group-adjacent="(position() - 1) idiv $chunk-size"> <xsl:result-document href="split-{position()}.xml"> <xsl:element name="{name(..)}" namespace="{namespace-uri(..)}"> <xsl:copy-of select="current-group()"/> </xsl:element> </xsl:result-document> </xsl:for-each-group> </xsl:template> </xsl:stylesheet>
Der Code funktioniert natürlich im Grunde auch mit der open source HE Version von Saxon 9.9 oder 9.8, nur dass die traditionelle Verarbeitung in XSLT, die das gesamte Dokument in eine navigierbare Baumstruktur einliest, auf den meisten Rechnern mit einer Eingabedatei von 8 GB vermutlich am Speicher scheitert.
Ansonsten kann man mit XmlReader/XmlWriter unter .NET oder StaX in Java oder ähnlichen APIs in anderen Programmiersprachen/Plattformen so was natürlich auch ausprogrammieren.Zuletzt editiert von Martin Honnen; 01.10.2019, 18:59. Reason: Erklärung hinzugefügt, dass der gepostete Code auch mit der open source Version von Saxon funktioniert, wenn der Speicher reicht, um derartig große Dateien im traditionellen Verarbeitungsmodus von XSL
Leave a comment:
-
Christian Marquardt
Nun weiss ich leider nicht, wie ich hier was schreoiben soll, da ich kein Informatiker bin. Deshalb recherchoiere ich, frage ....
Leave a comment:
-
Martin Honnen, Hallo, ja ich möchte dieser Datei in 4 Dateien mit derselben Struktur aufteilen. Die records haben keine ids, deshalb kann ich auch nicht sagen von bis....
Leave a comment:
-
Tolls??
Das XML hat eine Struktur. In deinem Falle kannst du bsp. jeden record in x-Dateien speichern, oder auch die records zählen und dann 50% in je eine Datei.
Dabei müssen natürlich jeweils das Rootelement (hier collection) manuell gesetzt werden (Anfang und Ende), sowie die xml Version.
Das kann man mit jeder Programmiersprache mit wenig Aufwand machen.
Leave a comment:
-
Willst du diese eine XML Datei in vier XML Dateien mit derselben Struktur aufteilen? Wo/wie soll aufgeteilt werden, nach "x" "record"-Elementen? Aber was hat das mit Microsoft Management Studio zu tun, mit dem man relationale Datenbanken von MS SQL Server verwaltet?
Leave a comment:
Leave a comment: