我有点困惑我的代码。我的XML
文件的子集正确写入csv。但是18MB大的实际文件并没有正确地写入csv。代码完全一样。我尝试了很多东西,但它只是不起作用。我在2天前问过另一个question并且已经提升到这一点。请帮忙。
我的代码:
doc<-xmlTreeParse("PrimaryCatchments.xml", options=HUGE)
top<-xmlRoot(doc)
extract <- xmlSApply(top, function(x) xmlSApply(x, xmlValue))
extract_df <- data.frame(t(extract),row.names=NULL)
my.df <- data.frame(lapply(extract_df, as.character), stringsAsFactors=FALSE)
write.csv(my.df,"Extract.csv", row.names=FALSE)
编辑:上面的代码写入数据子集
name,ExtendedData,三个不同列中的坐标。
但是,使用完整的大型XML文件,此代码会写入
地标,地标1,地标2 ......... Placemark1016
所以theres 1016列有数据。它的值也以"c("
开头
如何让我的大型XML文件写入3列和1016行?
答案 0 :(得分:1)
问题确实是xml文件的大小。但是,我可能有一个涉及多个步骤的解决方案。从本质上讲,您可以获取大型xml文件并将其切片为较小的片段(例如,10个100个Placemark元素)并让R迭代每个子集化的xml文件。
第1步:XSL脚本
要进行切片,您可以运行此XML转换样式表,xsl文件,在后续位置选择地标元素。
第一个100个地标
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:element name="kml">
<xsl:for-each select="(//Placemark)[100 >= position()]"><xsl:copy-of select="."/></xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
下一页101 - 200个地标
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:element name="kml">
<xsl:for-each select="(//Placemark)[(200 >= position()) and (101 <= position())]"><xsl:copy-of select="."/></xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
......等到1016个地标
第2步:XML转换
接下来,使用R,Python,PHP,VBA或其他语言使用上面这些单独的10个xsl文件转换大型xml。 R可能有一个xslt包(为此,我使用了Python&#39; lxml模块)。在您的代码中,每次转换后,分别保存每个较小的xml文件(每个大约1.5 MB):PrimaryCatchments_100.xml,PrimaryCatchments_200.xml等。每个文件看起来都像18 MB大版本,但只包含100个地标。
第3步:R XML PARSING
然后,让R提取每个较小的xml文件(考虑一个循环lapply函数)。
doc<-xmlTreeParse("PrimaryCatchments_100.xml", options=OLDSAX)
top<-xmlRoot(doc)
extract <- xmlSApply(top, function(x) xmlSApply(x, xmlValue))
extract_df <- data.frame(t(extract),row.names=NULL)
my.df <- data.frame(lapply(extract_df, as.character), stringsAsFactors=FALSE)
write.csv(my.df,"Extract_100.csv", row.names=FALSE)
...
第4步:R CSV附录
最后,使用R将所有10个csv提取文件附加在一起。请注意,Excel单元格的最大字符数为32,767,某些坐标为54,000+,这会强制csv的电子表格视图中的新单元格。
extract100df<-read.csv("Extract_100.csv")
extract200df<-read.csv("Extract_200.csv")
extract300df<-read.csv("Extract_300.csv")
extract400df<-read.csv("Extract_400.csv")
extract500df<-read.csv("Extract_500.csv")
extract600df<-read.csv("Extract_600.csv")
extract700df<-read.csv("Extract_700.csv")
extract800df<-read.csv("Extract_800.csv")
extract900df<-read.csv("Extract_900.csv")
extract1016df<-read.csv("Extract_1016.csv")
finaldf <- rbind(extract100df, extract200df, extract300df, extract400df, extract500df,
extract600df, extract700df, extract800df, extract900df, extract1016df)
write.csv <- ("FinalExtractData", row.names=FALSE)