У меня есть несколько больших (~ 10 ГБ и растет каждую неделю), которые мне нужно преобразовать из 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 работают, если файлы разделены.
Буду признателен за любые советы по повышению эффективности, поскольку файлы, с которыми я работаю, становятся больше каждую неделю. Я использую R на Linux-машине.
xmlEventParse
. - person Parfait   schedule 30.12.2020