Announcement

Collapse
No announcement yet.

XML Datei zerlegen

Collapse
This topic is closed.
X
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Anna85
    replied
    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?

    Leave a comment:


  • Christian Marquardt
    replied
    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:


  • Martin Honnen
    replied
    Originally posted by Anna85 View Post
    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....
    Ist dir die Anzahl der "record"-Elemente insgesamt bekannt, soll die Aufteilung in gleichen Teilen erfolgen? Ist die Anzahl der Elemente pro neuer Datei bekannt?

    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>
    Nachteil: XSLT 3 wird nur von Saxon 9.9 und 9.8 EE unterstützt, dafür braucht man eine Lizenz von Saxonica, es gibt aber eine "trial license". Saxon EE ist aber auch Teil von XML-IDEs wie oXygen, auch dafür gibt es eine "trial license".

    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:


  • Anna85
    replied
    Christian Marquardt 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:


  • Anna85
    replied
    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:


  • Christian Marquardt
    replied
    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:


  • Martin Honnen
    replied
    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:

Working...
X