Announcement

Collapse
No announcement yet.

XML Datei zerlegen

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

  • Anna85
    started a topic XML Datei zerlegen

    XML Datei zerlegen

    verwendetes Datenbanksystem: <Microsoft Management Studio>

    Hallo, ich habe eine ziemlich große xml Datei - 8GB. Sie ist wie folgends aufgebaut:
    Code:
     
     <?xml version="1.0"><collection xmlns=....> <record type="zeitung">   <id>texta </id>      <buch> abc </buch> </record > <record type="zeitung">   <id>textb </id>      <buch> def </buch> </record > <record type="zeitung">   <id>textc</id>      <buch> ghi </buch> </record > </collection>
    Wie kann ich jetzt die Datei in 4 Dateien zerlegen? Habe ich an Tolls gesucht, aber bisher nichts gefunden. Die Datensätze haben keine ids, also kann ich auch nicht sagen, von wo bis wo. Ich werde mich über jede Tipp freuen. Viele Grüße Anna

  • Christian Marquardt
    replied
    Crosspost
    https://www.mycsharp.de/wbb2/thread.php?threadid=122226

    Leave a comment:


  • defo
    replied
    Originally posted by Anna85 View Post
    irgendwie weiss ich es nicht wie ... ich kann einfach nicht programmieren.
    Was ich vorgeschlagen habe, ist keine Programmierung, sondern die Nutzung eines Programms/Tools.
    Man braucht nur einen Linux Rechner, wo man das eben installieren kann. Oder einen Windows Rechner mit Windows Subsystem Linux.
    Und der Rechner sollte bei 8Gb Daten wohl nicht allzu schwächlich sein, besonders wenn man auf ein Verfahren setzt, dass in irgendeiner Form den Inhalt analysiert.

    Ein anderer Ansatz- das war mein erster Vorschlag- ist die bloße Zerteilung, nach der Du ja im Grunde gefragt hast. Anschließend manuelle Korrektur (im Editor oder mit anderen Werkzeugen)
    Dabei könnte man so vorgehen, dass man nicht in 2GB Dateien zerteilt, sondern eine Größe wählt, die ein halbwegs ordentlicher Editor schluckt, nehmen wir 1 GB.
    Man zerhackt die Datein ohne auf den Inhalt zu achten in 8 Teile, das geht sehr schnell.
    Dann nimmt man jeweils Anfang und Ende, verschiebt verstümmelte Daten zur einen oder anderen Seite und ergänzt das/die Root Element(e) jeweils.

    Auch dabei muss man sich fragen, welchen Sinn es macht. Eine XML Datei von 1GB Größe dürfte nur von wenigen Programmen zu verarbeiten sein. Die Verarbeitung von XML beruht meist auf dem vollständigen Laden und Abbilden der Struktur im Hauptspeicher. Das ist auch bei deutlich weniger als 1GB Dateigröße nicht einfach.

    Noch besser wäre natürlich, von vornherein kleinere Dateien zu haben.

    Leave a comment:


  • defo
    replied
    Das tool entfernt offenbar das Root Element und die Splitdatei mit Endung 00 beschreibt die Zusammensetzung, die wieder das komplette File darstellt.
    Nicht ganz richtig: Die Splitdateien sind dann jeweils mit einem eigenen Root Element versehen.

    neben xml_split gibt es in dem installierten Paket weitere Toos, die z.B. auch wieder das Mergen erlauben.

    Die 100MB Datei hat als Beispiel schon ein einige Sekunden gedauert. Aber Du musst Dich so oder so auf eine größere Verarbeitungsdauer einstellen.

    Leave a comment:


  • defo
    replied
    Was ich geschrieben habe (im letzten Beitrag) bezieht sich auf fertige, kostenlose Programme, die man unter Linux (hier beschrieben: debian / ubuntu Distribution) installieren kann.
    Man braucht eigentlich nur einen Befehl (programm) xml_split, das wahrscheinlich das macht, was Du möchtest.
    Ich habe den ganzen Weg mit einer Beispieldatei beschrieben
    - Installation des Splitprogramms
    - Download einer Beispieldatei
    - Verarbeitung
    - Auflistung der Ergebnisdateien
    - Exemplarische Anzeige eines Dateianfangs und -endes

    Leave a comment:


  • Anna85
    replied
    Danke defo, aber ich verstehe das nicht, was du grade gesagt hast.
    Ich möchte nur ein Tool schreiben, der mir die Datei auf kleine Deteien zerlegt/aufteilt. Ich weiss, dass es geht, aber irgendwie weiss ich es nicht wie ... ich kann einfach nicht programmieren.

    Leave a comment:


  • defo
    replied
    Mit den Werkzeugen aus dem Paket xml-twig-tools kann man vielleicht auch was anfangen.

    Beispiel:
    Code:
    user@server:~$ sudo apt-get install xml-twig-tools
    
    user@server:~$ wget http://aiweb.cs.washington.edu/research/projects/xmltk/xmldata/data/SwissProt/SwissProt.xml
    
    user@server:~$ ls -lh SwissProt.xml
    -rw-r--r-- 1 user user 110M Jan  2  2002 SwissProt.xml
    
    user@server:~$ ls -lh SwissProt.xml
    -rw-r--r-- 1 user user110M Jan  2  2002 SwissProt.xml
    user@server:~$ xml_split -g 10000 SwissProt.xml
    user@server:~$ ls -lh SwissProt*
    -rw-r--r-- 1 user user  214 Okt  1 14:33 SwissProt-00.xml
    -rw-r--r-- 1 user user 23M Okt  1 14:33 SwissProt-01.xml
    -rw-r--r-- 1 user user 22M Okt  1 14:33 SwissProt-02.xml
    -rw-r--r-- 1 user user 22M Okt  1 14:33 SwissProt-03.xml
    -rw-r--r-- 1 user user 23M Okt  1 14:33 SwissProt-04.xml
    -rw-r--r-- 1 user user 22M Okt  1 14:33 SwissProt-05.xml
    -rw-r--r-- 1 user user 110M Jan  2  2002 SwissProt.xml
    
    user@server:~$ cat SwissProt-00.xml
    <root>
    <?merge subdocs = 0 :SwissProt-01.xml?>
    <?merge subdocs = 0 :SwissProt-02.xml?>
    <?merge subdocs = 0 :SwissProt-03.xml?>
    <?merge subdocs = 0 :SwissProt-04.xml?>
    <?merge subdocs = 0 :SwissProt-05.xml?></root>
    user@server:~$
    
    user@server:~$ head -n 10 SwissProt-01.xml
    <xml_split:root xmlns:xml_split="http://xmltwig.com/xml_split">
      <Entry id="100K_RAT" class="STANDARD" mtype="PRT" seqlen="889">
     <AC>Q62671</AC>
     <Mod date="01-NOV-1997" Rel="35" type="Created"></Mod>
     <Mod date="01-NOV-1997" Rel="35" type="Last sequence update"></Mod>
     <Mod date="15-JUL-1999" Rel="38" type="Last annotation update"></Mod>
     <Descr>100 KDA PROTEIN (EC 6.3.2.-)</Descr>
     <Species>Rattus norvegicus (Rat)</Species>
     <Org>Eukaryota</Org>
     <Org>Metazoa</Org>
    
    user@server:~$ tail -n 10 SwissProt-01.xml
      </DISULFID>
      <DISULFID from="26" to="52">
       <Descr>BY SIMILARITY</Descr>
      </DISULFID>
      <MOD_RES from="73" to="73">
       <Descr>AMIDATION</Descr>
      </MOD_RES>
     </Features>
    </Entry>
    </xml_split:root>
    Zuletzt editiert von defo; 02.10.2019, 15:02.

    Leave a comment:


  • Christian Marquardt
    replied
    Das ist kein sinnvolles vorgehen bei 8 GB Dateien jeweils die Tags zu suchen.
    ja, es soll id bis id stehen:
    verstehe ich nicht in Zusammenhang mit dem leader-Tag
    fso=FileSystemObjecte damit wird imho nicht im XML gesucht. Und eine Volltextsuche über das Filesystem ist ebenfalls recht sinnlos

    Leave a comment:


  • Anna85
    replied
    ja, es soll id bis id stehen:
    Code:
     
      EinDatei = "d:\xml zerlegen\Beispiel.xml" Von = "<record>" Bis = "</record>" SuchName = "<leader>(.+)</leader>" Set  fso = CreateObject("Scripting.FileSystemObject") EinOrdner = fso.GetParentFolderName(EinDatei)

    Leave a comment:


  • Christian Marquardt
    replied
    Ein Tag leader gab es bisher nicht, warum du im Filesystem einen Ordner suchst, wenn du sowieso den absoluten Pfad hast......Parentfolder ist
    d:\xml zerlegen\

    Leave a comment:


  • Anna85
    replied
    Ich versuche einen Script zu schreiben:

    Code:
     EinDatei = "d:\xml zerlegen\Beispiel.xml"
    Von = "<record>"
    Bis = "</record>"
    SuchName = "<leader>(.+)</leader>"
    Set  fso = CreateObject("Scripting.FileSystemObject")
    EinOrdner = fso.GetParentFolderName(EinDatei)

    Leave a comment:


  • defo
    replied
    Nein, meine Angaben ersparen nur das "Programmieren" einer Zerteilung.

    Leave a comment:


  • Christian Marquardt
    replied
    defo
    und das XML? Die Struktur? Die Datei kann ich nach dem zerteilen einfach als XML wieder irgendwo einlesen?

    Leave a comment:


  • defo
    replied
    Falls Du mit Linux arbeiten kannst, könnte man die Befehle wc und split zum zählen und trennen verwenden.
    Auf dem Server suse im Verzeichnis /var/log liegt die Datei zum zerteilen: zypper.log, ca 3,5 MB groß.
    wc zählt die Zeilen und gibt das Ergebnis aus.
    split zeiteilt nun in 18000 Zeilen Schritten, ohne eine Zeile selbst zu zerteilen
    Das Ergebnis sind 2 neue Dateien mit dem zuvor gewählten Präfix im Namen und einem "durchnummerierten" Ende.
    Code:
    suse:/var/log # ls -l zypper.log
    -rw-r----- 1 root root 3575813 Aug 29  2018 zypper.log
    
    suse:/var/log # wc -l zypper.log
    35589 zypper.log
    
    suse:/var/log # split -l18000 zypper.log zyppersplit.log
    suse:/var/log # ls -lrt zyppersplit.log*
    -rw-r--r-- 1 root root 1833001 Oct  1 13:34 zyppersplit.logaa
    -rw-r--r-- 1 root root 1742812 Oct  1 13:34 zyppersplit.logab

    Leave a comment:


  • Christian Marquardt
    replied
    da die Datei muss mit record beginnen und enden.
    Nein das Rootelement ist "collection"

    Leave a comment:

Working...
X