У меня есть большие файлы XML, которые я хочу превратить в кадры данных для дальнейшей обработки в R и других программах.Все это делается в macOS.
Каждый ежемесячный XML имеет размер около 1 ГБ, имеет 150 тыс. Записей и 191 переменную.В конце концов, мне могут не понадобиться полные 191 переменная, но я бы хотел сохранить их и принять решение позже.
Доступ к XML-файлам можно получить здесь (прокрутите список до конца для ежемесячногомол, в несжатом виде нужно смотреть на «dming» XML)
Я добился определенного прогресса, но обработка больших файлов занимает слишком много времени (см. ниже)
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-5k), ноэто вероятно слишком неэффективно для 150k записей, и на самом деле я ждал пару часов, и это еще не закончилось.Конечно, мне нужно будет запускать этот код только раз в месяц, но я бы все же хотел его улучшить.
Я пытался превратить элементы для всех записей в список, используя функцию as_list
в xml2
так что я мог бы продолжить с plyr
, но это также заняло слишком много времени.
Заранее спасибо.