我有一个15 GB的XML文件,我想把它拆分。它有大约3亿行。它没有任何相互依赖的顶级节点。是否有任何可用的工具可以为我做这件事?
答案 0 :(得分:9)
XmlSplit - 分割大型XML文件的命令行工具
xml_split - 将大型XML文档拆分为更小的块
通过bhayanakmaut拆分XML (没有源代码,我无法使这个工作)
答案 1 :(得分:4)
QXMLEdit有一个专门的功能:我成功地使用了维基百科转储。 ~2.7Gio文件变成了一堆~1 400 000个文件(每页一个)。它甚至允许您在子文件夹中发送它们。
答案 2 :(得分:3)
我认为除非您有兴趣以编程方式进行操作,否则必须手动拆分。 Here's a sample这样做,虽然它没有提到处理的XML文件的最大大小。手动执行时,出现的第一个问题是如何打开文件本身。
我会推荐一个非常简单的文本编辑器 - 类似于Vim。处理这样大的文件时,关闭所有形式的语法高亮和/或折叠总是有用的。
值得考虑的其他选择:
EditPadPro - 我从来没有尝试过任何这么大的东西,但是如果它和其他JGSoft产品一样,那应该是轻而易举的。请记得关闭语法高亮显示。
VEdit - 我已经将它用于1GB大小的文件,就像它什么都没有一样。
答案 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视频和文章:
答案 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文件而且根本不介意,但请确保关闭自动备份功能。