XML文件的大分割

时间:2009-03-31 06:12:48

标签: xml

我有一个15 GB的XML文件,我想把它拆分。它有大约3亿行。它没有任何相互依赖的顶级节点。是否有任何可用的工具可以为我做这件事?

10 个答案:

答案 0 :(得分:9)

XmlSplit - 分割大型XML文件的命令行工具

xml_split - 将大型XML文档拆分为更小的块

通过bhayanakmaut拆分XML (没有源代码,我无法使这个工作)

类似的问题:How do I split a large xml file?

答案 1 :(得分:4)

QXMLEdit有一个专门的功能:我成功地使用了维基百科转储。 ~2.7Gio文件变成了一堆~1 400 000个文件(每页一个)。它甚至允许您在子文件夹中发送它们。

答案 2 :(得分:3)

我认为除非您有兴趣以编程方式进行操作,否则必须手动拆分。 Here's a sample这样做,虽然它没有提到处理的XML文件的最大大小。手动执行时,出现的第一个问题是如何打开文件本身。

我会推荐一个非常简单的文本编辑器 - 类似于Vim。处理这样大的文件时,关闭所有形式的语法高亮和/或折叠总是有用的。

值得考虑的其他选择:

  1. EditPadPro - 我从来没有尝试过任何这么大的东西,但是如果它和其他JGSoft产品一样,那应该是轻而易举的。请记得关闭语法高亮显示。

  2. VEdit - 我已经将它用于1GB大小的文件,就像它什么都没有一样。

  3. EmEditor

答案 3 :(得分:3)

这是一个低内存占用脚本,可以使用CMarkup文件模式在免费的firstobject XML编辑器(foxe)中完成。我不确定你的意思是没有相互依赖的顶级节点或标签检查,但假设在根元素下你有数百万个包含对象属性或行的顶级元素,每个元素需要作为一个整体保存在一起,你想要说每个输出文件100万,你可以这样做:

split_xml_15GB()
{
  int nObjectCount = 0, nFileCount = 0;
  CMarkup xmlInput, xmlOutput;
  xmlInput.Open( "15GB.xml", MDF_READFILE );
  xmlInput.FindElem(); // root
  str sRootTag = xmlInput.GetTagName();
  xmlInput.IntoElem();
  while ( xmlInput.FindElem() )
  {
    if ( nObjectCount == 0 )
    {
      ++nFileCount;
      xmlOutput.Open( "piece" + nFileCount + ".xml", MDF_WRITEFILE );
      xmlOutput.AddElem( sRootTag );
      xmlOutput.IntoElem();
    }
    xmlOutput.AddSubDoc( xmlInput.GetSubDoc() );
    ++nObjectCount;
    if ( nObjectCount == 1000000 )
    {
      xmlOutput.Close();
      nObjectCount = 0;
    }
  }
  if ( nObjectCount )
    xmlOutput.Close();
  xmlInput.Close();
  return nFileCount;
}

我在这里发布了YouTube视频和文章:

http://www.firstobject.com/xml-splitter-script-video.htm

答案 4 :(得分:1)

开源库逗号有几个工具可以在非常大的XMl文件中查找数据并将这些文件拆分成较小的文件。

https://github.com/acfr/comma/wiki/XML-Utilities

这些工具是使用expat SAX解析器构建的,因此它们不会使用像xmlstarlet和saxon这样的DOM树来填充内存。

答案 5 :(得分:0)

你需要以什么方式拆分它?使用XmlReader.ReadSubTree编写代码非常简单。它将针对当前元素及其所有子元素返回一个新的xmlReader实例。所以,移动到root的第一个子节点,调用ReadSubtree,编写所有节点,使用原始读取器调用Read(),然后循环直到完成。

答案 6 :(得分:0)

Used this for splitting Yahoo Q&A dataset

    count = 0
    file_count = 1
    with open('filepath') as f:

    current_file = ""

    for line in f:
        current_file = current_file + line

        if "</your tag to split>" in line:
            count = count + 1

        if count==50000:
            current_file = current_file + "</endTag>"
            with open('filepath/Split/file_' +str(file_count)+'.xml' , 'w') as split:
                split.write(current_file)
            file_count = file_count + 1
            current_file = "<?xml version='1.0' encoding='UTF-8'?>\n<endTag>"
            count = 0

current_file = current_file + "</endTag>"
with open('filepath/Split/file_' +str(file_count)+'.xml' , 'w') as split:
    split.write(current_file)

答案 7 :(得分:0)

我使用了XmlSplit向导工具。它确实很好用,您可以指定split方法,例如元素,行,文件数或文件大小。唯一的问题是,我必须以99美元的价格购买它,因为试用版不允许您拆分所有数据,只能拆分奇数个文件。我能够分割一个70GB的文件!

答案 8 :(得分:0)

也许这个问题仍然存在,我相信它可以帮助别人。 有一个xml编辑器XiMpLe,其中包含用于拆分大文件的工具。只需要片段大小。还有反向功能可以将xml文件链接在一起(!)。 它是免费的,用于非商业用途,并且许可证也不是很昂贵。 无需安装。对我来说,它工作得非常好(我有5GB的文件)。

答案 9 :(得分:-1)

不是Xml工具,但Ultraedit可能有帮助,我已经将它用于2G文件而且根本不介意,但请确保关闭自动备份功能。