使用xml2包读取大型XML文件并尝试创建工作闭包的问题
我使用xml2包将一个巨大的
XML文件读入内存,命令失败,出现以下错误:
我的代码如下所示: library(xml2) doc <- read_xml('~/Downloads/FBrf.xml') 数据可以在ftp://ftp.flybase.net/releases/FB2015_05/reporting-xml/FBrf.xml.gz(大约140MB)下载,解压后大约1.8GB. 有没有人建议如何找出哪些字符有问题或如何在阅读之前清理文件. 编辑 好的,因为文件很大,我搜索了堆栈溢出的其他解决方案,并尝试实现Martin Morgan的解决方案,他在这里提出了Combine values in huge XML-files 所以我到目前为止所做的是以下几行代码 library(XML) branchFunction <- function(progress=10) { res <- new.env(parent=emptyenv()) # for results it <- 0L # iterator -- nodes visited list(publication=function(elt) { ## handle 'publication' nodes if (getNodeSet(elt,"not(/publication/feature/id)")) ## early exit -- no feature id return(NULL) it <<- it + 1L if (it %% progress == 0L) message(it) publication <- getNodeSet(elt,"string(/publication/id/text())") # 'key' res[[publication]] <- list(miniref=getNodeSet(elt,"normalize-space(/publication/miniref/text())"),features= xpathSApply(elt,"//feature/id/text()",xmlValue)) },getres = function() { ## retrieve the 'res' environment when done res },get=function() { ## retrieve 'res' environment as data.frame publication <- ls(res) miniref <- unlist(eapply(res,"[[","miniref"),use.names=FALSE) feature <- eapply(res,"features") len <- sapply(feature,length) data.frame(publication=rep(publication,len),feature=unlist(feature,use.names=FALSE),miniref=rep(miniref,len)) }) } branches <- branchFunction() xmlEventParse("~/Downloads/jnk.xml",handlers=NULL,branches=branches) # xmlEventParse("~/Downloads/FBrf.xml",branches=branches) branches$get() 我将xml文件上传到我的服务器http://download.dejung.net/jnk.xml 该文件只有几kb,但问题是结果.第二个出版物条目具有id FBrf0162243和Schwartz等人的miniref,2003,Mol.细胞.生物学. 23(19):6876–6886. 我上面发布的代码的结果报告了相应miniref的错误发布ID.功能ID是正确的….
不知道为什么我的代码报告了错误的值,也许有人可以帮我解决这个问题,因为这对我来说很新.
我偶尔会遇到可能与此类似的“嵌入式NULL”错误消息(如果此消息中的0x0表示相同的NULL问题).我的方法是在读取文件之前尝试删除它们,因为我还没有找到忽略它们的R包.
如果您使用的是Unix或OS X,则可以通过以下方式在R程序中调用sed: system( 'sed "s/ //g" ~/Downloads/dirty.xml > ~/Downloads/clean.xml' ) 如果这不起作用,你可能想要扩展这个字符的“黑名单” – 例如参见Unicode Regex; Invalid XML characters 如果仍然有问题,那么有时我会将字符列入白名单 – 删除不在指定字符集中的所有内容. sed’s / [^ A-Za-z0-9 _.,“] // g’?/ Downloads / dirty.csv>?/ Downloads / clean.csv 这是我用于.csv数据文件的那个(不关心< /etc.u0026gt;),所以你可能想把它扩展为类似[^ [:ascii:]]的东西: 如果您使用的是Windows,则可能必须在R之外使用此方法 – 例如,您可以使用Cygwin而不是上面的system()调用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |