我想将XML LEI数据从GLEIF转换为R data.frame
。进一步查看脚本,哪种方法有效,并提供所需的数据:
(使用此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"))}
}