Мне было интересно, удалось ли кому-нибудь прочитать XML-файлы SDMX -в кадр данных. Файл, который я хотел бы прочитать, этоhttps://www.ecb.europa.eu/stats/sdmx/icpf/1/data/pension_funds.xml(1мб ). Я сохранил файл как «пенсии _funds.xml» в pwd и попытался использовать пакет XML для его чтения :
fileName <- system.file("pensions", "pensions_funds.xml", package="XML")
parsed<-xmlTreeParse("pension_funds.xml",getDTD=F)
r<-xmlRoot(parsed)
tmp = xmlSApply(r, function(x) xmlSApply(x, xmlValue))
. Несколько строк выше в основном следуют примеру здесьhttp://www.omegahat.org/RSXML/gettingStarted.html но я думаю, что мне сначала нужно как-то игнорировать заголовок (, который я вставил ниже первых нескольких страниц файла, который я пытаюсь прочитать ). Поэтому я думаю, что вышеизложенное может работать, но оно начинается с неправильного узла для моих целей. Я хотел бы получить значения obs _, проиндексированные по их периоду времени _и области ссылки _.
Первое, что нужно сделать, это найти правильный узел и начать с него, однако я подозреваю, что могу оказаться на дурацком задании, поскольку у меня ограниченные знания о форматах данных, и я не уверен, что пакет XML можно использовать для файлов SDMX -XML.. Кажется, более умные люди пытались это сделать.http://opensdmxdevelopers.wikispaces.com/RSDMX Я не могу найти этот пакет для загрузки на его домашней странице здесьhttps://r-forge.r-project.org/projects/rsdmx/ (Я не вижу ни одного раздела ссылки/загрузки, но, возможно, я слепой )и, похоже, это ранние стадии. Существование rsdmx предполагает, что использование пакета xml для чтения sdmx может быть непростым, поэтому я готов сдаться на этом этапе, если только кто-то не добился успеха в этом. На самом деле меня в основном интересует чтение этого файлаhttp://www.ecb.europa.eu/stats/sdmx/bsi/1/data/outstanding_amounts.xml Но это файл размером 10 МБ, поэтому я начал с меньшего размера.
редактировать3 попытка ответа sgibb на большой файл с использованием изменений в комментарии Миши библиотека ("XML")
url <- "http://www.ecb.europa.eu/stats/sdmx/bsi/1/data/outstanding_amounts.xml"
sdmxHandler <- function() {
## data.frame which stores results
data <- data.frame(stringsAsFactors=FALSE)
## counter to store current row
i <- 1
## temp value to store current REF_AREA
## temp value to store current REF_AREA
refArea <- NA
bsItem <- NA
bsCountSector <- NA
## handler subroutine for Obs tag
Obs <- function(name, attr) {
## found an Obs tag and now fill data.frame
data[i, "refArea"] <<- refArea
data[i, "timePeriod"] <<- as.numeric(attr["TIME_PERIOD"])
data[i, "obsValue"] <<- as.numeric(attr["OBS_VALUE"])
data[i, "bsItem"] <<- bsItem
data[i, "bsCountSector"] <<- bsCountSector
i <<- i + 1
}
## handler subroutine for Series tag
Series <- function(name, attr) {
refArea <<- attr["REF_AREA"]
bsItem <<- as.character(attr["BS_ITEM"])
bsCountSector <<- as.numeric(attr["BS_ITEM"])
}
return(list(getData=function() {return(data)},
Obs=Obs, Series=Series))
}
## run parser
df <- xmlEventParse(file(url), handlers=sdmxHandler())$getData()
Specification mandate value for attribute OBS_VALUE
attributes construct error
Couldn't find end of Start Tag Obs line 15108
Premature end of data in tag Series line 15041
Premature end of data in tag DataSet line 91
Premature end of data in tag CompactData line 2
Error: 1: Specification mandate value for attribute OBS_VALUE
2: attributes construct error
3: Couldn't find end of Start Tag Obs line 15108
4: Premature end of data in tag Series line 15041
5: Premature end of data in tag DataSet line 91
6: Premature end of data in tag CompactData line 2
In addition: There were 50 or more warnings (use warnings() to see the first 50)
редактировать2: ответ от sgibb выглядит идеально и отлично работает с файлом меньшего размера. Я пытался запустить его на
url <- http://www.ecb.europa.eu/stats/sdmx/bsi/1/data/outstanding_amounts.xml
(файл 10mb, исходная ссылка исправлена ),с единственной модификацией, заключающейся в добавлении двух строк:
data[i, "bsItem"] <<- as.character(attr["BS_ITEM"])
data[i, "bsCountSector"] <<- as.numeric(attr["BS_COUNT_SECTOR"])
(это дополнительные переменные идентификатора, которые необходимы для идентификации строки в этом большом наборе данных ). Он работал несколько минут, а затем завершился с этой ошибкой:
Error: 1: Specification mandate value for attribute TIME_PE
2: attributes construct error
3: Couldn't find end of Start Tag Obs line 20743
4: Premature end of data in tag Series line 20689
5: Premature end of data in tag DataSet line 91 6: Premature end of data in tag CompactData line 2
Кроме того :было 50 или более предупреждений (используйте предупреждения (), чтобы увидеть первые 50)
Базовый формат данных кажется очень похожим, поэтому я подумал, что это может сработать. Основной формат файла размером 10 МБ приведен ниже :
. редактировать1:
желаемый формат данных:
Ref_area time_period obs_value
At 2006 118
At 2007 119
…
Be 2006 101
…
Вот первый бит данных.
DataSet xsi:schemaLocation="https://www.ecb.europa.eu/vocabulary/stats/icpf/1 https://www.ecb.europa.eu/stats/sdmx/icpf/1/structure/2011-08-11/sdmx-compact.xsd" xmlns="https://www.ecb.europa.eu/vocabulary/stats/icpf/1">