【发布时间】:2020-12-29 18:40:32
【问题描述】:
我有一些大的(约 10 GB 并且每周都在增长),我需要将它们从 XML 转换为 R 中的数据框以进行分析。 XML 的结构如下(多条记录,每条记录多一些字段元素):
<recordGroup>
<records>
<record>
<recordId>123442</recordId>
<reportingCountry>PT</reportingCountry>
<date>2020-02-20</date>
<field>
<fieldName>Gender</fieldName>
<fieldValue>F</fieldValue>
</field>
<field>
<fieldName>Age</fieldName>
<fieldValue>57</fieldValue>
</field>
<field>
<fieldName>ClinicalSymptoms</fieldName>
<fieldValue>COUGH</fieldValue>
<fieldValue>FEVER</fieldValue>
<fieldValue>O</fieldValue>
<fieldValue>RUNOS</fieldValue>
<fieldValue>SBREATH</fieldValue>
</field>
</record>
</records>
</recordGroup>
我一直在尝试找到提取数据并将它们转换为 data.frame 的最有效方法,但是一个主要挑战是文件非常大,并且 XML 和 XML2 都会遇到问题,这需要花费数小时来处理。我目前的策略是使用下面的代码使用xmlEventParse,但这似乎效率更低。
value_df <- data.frame(recordId = as.character(), vardf = as.character(), value = as.character())
nvar <- 0
xmlEventParse(xmlDoc_clean,
list(
startElement = function (name, attrs) {
tagName <<- name
},
text = function (x) {
if (nchar(x) > 0) {
if (tagName == "recordId") {
rec <<- x
} else
if (tagName == "fieldName") {
var_f <<- x
} else {
if (tagName == 'fieldValue') {
v <- x
nvar <<- nvar + 1
value_df[nvar, 1:3] <<- c(rec, var_f, v)
}
}
}
},
endElement = function (name) {
if (name == 'record') {
print(nvar)
}
}
))
我已经尝试过 XML2(内存问题)、XML(内存问题以及标准 DOM 解析),并且还打算尝试使用 XMLSchema,但没有设法让它工作。如果文件被拆分,XML 和 XML2 都可以工作。
由于我正在处理的文件每周都在变大,因此我将不胜感激有关提高效率的任何指导。我在 linux 机器上使用 R。
【问题讨论】:
-
您在此处看到答案更新了吗? stackoverflow.com/questions/33446888/…
-
@ibilgen 谢谢,是的——我尝试过类似的方法,但试图找到最有效的方法,因为我的数据集非常大,并且可能需要几个小时才能用 XML2 解析。我还没有弄清楚如何使用该问题的另一个答案中提到的 XSLT。
-
见R: xmlEventParse with Large, Varying-node XML Input and Conversion to Data Frame。接受的解决方案使用
xmlEventParse。 -
@Parfait 使用分支的方法似乎也很有效,而且看起来比使用处理程序要快一些。我会继续努力并发布代码,希望对其他人有用。