Avatar billede rasmuslh Nybegynder
13. april 2010 - 15:27 Der er 9 kommentarer og
1 løsning

Splitte XML dokumenter på mere end 2 GB

Hej

Jeg har via en webservice modtaget nogle rimelig store XML-filer indeholdende stamdata på biler. Første gang man kalder disse webservices modtager man alting der ikke er hentet før og det har givet nogle kæmpe XML-filer (4 GB og 6 GB).

Jeg vil gerne sætte et automatisk load op så tingene hentes løbende, men mit ETL-værtkøj understøtter ikke de store initiel XML-filer.

Jeg har ledt efter et splitter program, men det lader til at alle dem der findes er 32-bit og derfor knækker nakken ved 2GB.

Er der derfor en venlig sjæl der har en ide til hvor man får splittet XML-dokumentet op så det kan loopes ind i mindre bider eller alternativt kender til et program der kan håndtere filer af den størrelse.

PÅ forhånd tak.

Rasmus
Avatar billede arne_v Ekspert
13. april 2010 - 15:33 #1
Du skal bare bruge en even driven parser (enten push eller pull) ikke en DOM parser.
Avatar billede rasmuslh Nybegynder
13. april 2010 - 15:43 #2
Hej Arne_v

Findes der en applikation man kan anvende? jeg synes jeg har søgt efter det?

Rasmus
Avatar billede arne_v Ekspert
13. april 2010 - 16:29 #3
Jeg taenker paa programmering af en special loesning.
Avatar billede rasmuslh Nybegynder
14. april 2010 - 08:21 #4
Hmmmh - det var træls. Jeg havde håbet at jeg kunne lave et engangsplit da det kun er et initiale load der skal splittes.
Avatar billede rasmuslh Nybegynder
14. april 2010 - 08:21 #5
Nå, men så må jeg jo op på hesten. Skriver du et svar så du får point.
Avatar billede arne_v Ekspert
15. april 2010 - 02:52 #6
Den må skulle splittes på en måde som er specific for din XML, så det er svært at finde et generelt tool.

Hvis du fortæller hvilke programmerings sprog du har til rådighed, så kan jeg komme med et eksempel.
Avatar billede arne_v Ekspert
15. april 2010 - 02:53 #7
og et svar
Avatar billede rasmuslh Nybegynder
15. april 2010 - 10:47 #8
C# understøttes af mit ETL-værktøj så det vil nok være bedst.
Avatar billede arne_v Ekspert
17. april 2010 - 23:52 #9
C:\>type big.xml
<all>
  <part>
      <a>1</a>
      <b>2</b>
  </part>
  <part>
      <a>3</a>
      <b>4</b>
  </part>
  <part>
      <a>5</a>
      <b>6</b>
  </part>
</all>

C:\>e29.exe big bigpart part

C:\>type bigpart_0001.xml
&#8745;&#9559;&#9488;<?xml version="1.0" encoding="utf-8"?>
<part>
      <a>1</a>
      <b>2</b>
  </part>
C:\>type bigpart_0002.xml
&#8745;&#9559;&#9488;<?xml version="1.0" encoding="utf-8"?>
<part>
      <a>3</a>
      <b>4</b>
  </part>
C:\>type bigpart_0003.xml
&#8745;&#9559;&#9488;<?xml version="1.0" encoding="utf-8"?>
<part>
      <a>5</a>
      <b>6</b>
  </part>
C:\>
Avatar billede arne_v Ekspert
17. april 2010 - 23:52 #10
using System;
using System.Xml;
using System.Text;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            string infnm = args[0];
            string outfnm = args[1];
            string splittag = args[2];
            int n = 0;
            XmlReader xr = new XmlTextReader(infnm + ".xml");
            XmlTextWriter xtw = null;
            while (xr.Read())
            {
                if (xr.NodeType == XmlNodeType.Element && xr.Name == splittag)
                {
                    n++;
                    xtw = new XmlTextWriter(String.Format("{0}_{1:0000}.xml", outfnm, n), Encoding.UTF8);
                    xtw.Formatting = Formatting.Indented;
                    xtw.WriteStartDocument();
                    xtw.WriteNode(xr, false);
                    xtw.WriteEndDocument();
                    xtw.Close();
                }
                else
                {
                    // ignore everything else
                }
            }
            xr.Close();
        }
    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester