У меня есть большие файлы XML, которые я хочу превратить в фреймы данных для дальнейшей обработки в R и других программах. Все это делается в macOS.
Каждый ежемесячный XML имеет размер около 1 ГБ, содержит 150 тыс. записей и 191 различную переменную. В конце концов, мне может не понадобиться полная 191 переменная, но я хотел бы сохранить их и решить позже.
Доступ к файлам XML можно получить здесь (прокрутите вниз, чтобы просмотреть ежемесячные почтовые индексы, в несжатом виде следует смотреть XML-файлы «dming»)
Я добился определенного прогресса, но обработка больших файлов занимает слишком много времени (см. ниже)
XML выглядит следующим образом:
<ROOT>
<ROWSET_DUASDIA>
<ROW_DUASDIA NUM="1">
<variable1>value</variable1>
...
<variable191>value</variable191>
</ROW_DUASDIA>
...
<ROW_DUASDIA NUM="150236">
<variable1>value</variable1>
...
<variable191>value</variable191>
</ROW_DUASDIA>
</ROWSET_DUASDIA>
</ROOT>
Я надеюсь, что это достаточно ясно. Я впервые работаю с XML.
Я просмотрел здесь много ответов и фактически сумел получить данные в кадре данных, используя меньшую выборку (используя ежедневный XML вместо ежемесячных) и xml2
. Вот что я сделал
library(xml2)
raw <- read_xml(filename)
# Find all records
dua <- xml_find_all(raw,"//ROW_DUASDIA")
# Create empty dataframe
dualen <- length(dua)
varlen <- length(xml_children(dua[[1]]))
df <- data.frame(matrix(NA,nrow=dualen,ncol=varlen))
# For loop to enter the data for each record in each row
for (j in 1:dualen) {
df[j, ] <- xml_text(xml_children(dua[[j]]),trim=TRUE)
}
# Name columns
colnames(df) <- c(names(as_list(dua[[1]])))
Я предполагаю, что это довольно рудиментарно, но я также новичок в R.
Во всяком случае, это прекрасно работает с ежедневными данными (4-5 тысяч записей), но, вероятно, это слишком неэффективно для 150 тысяч записей, и на самом деле я ждал пару часов, и это не закончилось. Конечно, мне нужно будет запускать этот код только раз в месяц, но тем не менее я хотел бы его улучшить.
Я попытался превратить элементы для всех записей в список, используя функцию as_list
в xml2
, чтобы продолжить работу с plyr
, но это также заняло слишком много времени.
Заранее спасибо.