将大型XML文件从LEI转换为R data.frame的有效方法

时间:2018-06-20 08:13:49

标签: r xml xml-parsing

我想将XML LEI数据从GLEIF转换为R data.frame。进一步查看脚本,哪种方法有效,并提供所需的数据:

enter image description here (使用此test.xml文件自己进行测试。)

但是,对于大型的LEI XML文件(2.4 GB),下面的脚本会变慢,几乎停止运行。

我确信有更有效的方法可以将LEI XML转换为R data.frame。我在Stackoverflow上尝试了其他解决方案,但是无法使它们正常工作。 python script导致内存泄漏。网络上的许多示例都使用较小的文件,但是LEI文件大于2GB。

下面的脚本可以工作,但是会逐行拖拽文件,这让我感到担忧:这样花费太长时间了。

欢迎任何帮助。

require("XML")
require("plyr")
setwd('/home/lei/')
Sys.setlocale(category="LC_ALL", locale="en_US.UTF-8")

xmlfile=xmlParse("20180619-gleif-concatenated-file-lei2.xml", encoding = "UTF-8")
class(xmlfile) 
xmltop = xmlRoot(xmlfile) 
class(xmltop)
xmlName(xmltop) #give name of node: LEIData 
xmlSize(xmltop) #how many children in node, 2
xmlName(xmltop[[1]]) #name of root's children
xmlName(xmltop[[2]]) #we need LEIRecords
nofrecords = xmlSize(xmltop[[2]])

df <- data.frame(number=integer(), Lei=character(), Name=character(), City=character(),Country=character()) 
# for(i in nofrecords-10000:nofrecords) {
for(i in 1:nofrecords) {
  lei  =     xmlSApply(xmltop[[2]][[i]][["LEI"]], xmlValue) 
  name =     xmlSApply(xmltop[[2]][[i]][[2]][["LegalName"]], xmlValue) 
  city = try(xmlSApply(xmltop[[2]][[i]][[2]][[3]][["City"]], xmlValue))
  ctry = try(xmlSApply(xmltop[[2]][[i]][[2]][[3]][["Country"]], xmlValue)) 
  de <- list(number=i, Lei=lei, Name = name, City=city, Country=ctry)
  df = rbind(df,de, stringsAsFactors=FALSE)
  if(i %% 1000==0) {cat(paste0("iteration: ", i, "\n"))}
}

0 个答案:

没有答案