2013-06-07 2 views
2

Есть ли у кого-нибудь опыт импорта данных в R из Atom-совместимой системы передачи данных? Я скачал «.atomsvc» файл и opended его содержимое в блокноте и получить следующее:Импорт данных в R из Atom-совместимой передачи данных

<?xml version="1.0" encoding="utf-8" standalone="yes"?><service xmlns:atom="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xmlns="http://www.w3.org/2007/app"><workspace><atom:title>OperationallyAvailableCapacity</atom:title><collection href="http://10.101.111.234/ReportServer?%2FInfoPost%2FOperationallyAvailableCapacity&amp;AssetNbr=51&amp;beg_date=05%2F03%2F2013%2000%3A00%3A00&amp;LocationNbr=%25&amp;LocationProp=%25&amp;LocationName=%25&amp;DirOfLow=%25&amp;rs%3AParameterLanguage=&amp;rs%3ACommand=Render&amp;rs%3AFormat=ATOM&amp;rc%3ADataFeed=xAx0x13"><atom:title>table1</atom:title></collection></workspace></service> 

Я предполагаю, что импортировать этот я, вероятно, придется пользователя RCurl, но так как я ограниченный опыт с этим пакетом я надеялся, что кто-то может указать мне в правильном направлении.

Любая помощь будет оценена по достоинству.

ответ

2

Каналы предоставляют вам информацию в формате XML, которая может быть проанализирована с использованием пакета XML.

library(XML) 
url <- 'http://housesofstones.com/blog/feed/atom/' 

# Download and parse the data 
xml_data <- xmlParse(url) 

# Convert the xml structure to a list so you can work with it in R 
xml_list <- xmlToList(xml_data) 

str(head(xml_list)) 

List of 6 
$ title :List of 2 
..$ text : chr "Houses of Stones" 
..$ .attrs: Named chr "text" 
.. ..- attr(*, "names")= chr "type" 
$ subtitle:List of 2 
..$ text : chr "\"Science is facts; just as houses are made of stones, so is science made of facts; but a pile of stones is not a house and a c"| __truncated__ 
..$ .attrs: Named chr "text" 
.. ..- attr(*, "names")= chr "type" 
$ updated : chr "2013-05-16T12:16:49Z" 
$ link : Named chr [1:3] "alternate" "text/html" "http://housesofstones.com/blog" 
..- attr(*, "names")= chr [1:3] "rel" "type" "href" 
$ id  : chr "http://housesofstones.com/blog/feed/atom/" 
$ link : Named chr [1:3] "self" "application/atom+xml" "http://housesofstones.com/blog/feed/atom/" 
..- attr(*, "names")= chr [1:3] "rel" "type" "href" 

Или, используя ваш пример данных:

example_data <- '<?xml version="1.0" encoding="utf-8" standalone="yes"?><service xmlns:atom="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xmlns="http://www.w3.org/2007/app"><workspace><atom:title>OperationallyAvailableCapacity</atom:title><collection href="http://10.101.111.234/ReportServer?%2FInfoPost%2FOperationallyAvailableCapacity&amp;AssetNbr=51&amp;beg_date=05%2F03%2F2013%2000%3A00%3A00&amp;LocationNbr=%25&amp;LocationProp=%25&amp;LocationName=%25&amp;DirOfLow=%25&amp;rs%3AParameterLanguage=&amp;rs%3ACommand=Render&amp;rs%3AFormat=ATOM&amp;rc%3ADataFeed=xAx0x13"><atom:title>table1</atom:title></collection></workspace></service>' 

xml_data <- xmlParse(example_data) 

# Convert the xml structure to a list so you can work with it in R 
xml_list <- xmlToList(xml_data) 

str(xml_list) 

List of 1 
$ workspace:List of 2 
..$ title  : chr "OperationallyAvailableCapacity" 
..$ collection:List of 2 
.. ..$ title : chr "table1" 
.. ..$ .attrs: Named chr "http://10.101.111.234/ReportServer?%2FInfoPost%2FOperationallyAvailableCapacity&AssetNbr=51&beg_date=05%2F03%2F2013%2000%3A00%3"| __truncated__ 
.. .. ..- attr(*, "names")= chr "href" 

EDIT

при ближайшем рассмотрении, это выглядит, как ваш конкретный пример данных по какой-то причине держит тонны информации в одном узел, закодированный в URL-адресе. Если вам нужны эти данные, вам нужно будет вытащить их.

Во-первых, вызвать, что одним узлом, и декодировать URL, так что легче разобрать:

xml_content <- URLdecode(xml_list$workspace$collection$.attrs) 

Вы различные параметры разделяются «&», так что вы можете разделить строку этим символом.

xml_content <- unlist(strsplit(xml_content, "&")) 

Каждая новая строка содержит как имя параметра, так и значение, разделенное знаком равенства. Существует несколько способов разделить эту информацию. Возможно, самый простой способ заключается в использовании функции str_split_fixed из plyr пакета:

require(stringr) 

str_split_fixed(xml_content, "=", 2) 

[,1]                   [,2]     
[1,] "http://10.101.111.234/ReportServer?/InfoPost/OperationallyAvailableCapacity" ""     
[2,] "AssetNbr"                 "51"     
[3,] "beg_date"                 "05/03/2013 00:00:00" 
[4,] "LocationNbr"                 "%"     
[5,] "LocationProp"                "%"     
[6,] "LocationName"                "%"     
[7,] "DirOfLow"                 "%"     
[8,] "rs:ParameterLanguage"              ""     
[9,] "rs:Command"                 "Render"    
[10,] "rs:Format"                 "ATOM"    
[11,] "rc:DataFeed"                 "xAx0x13"  
+0

Спасибо за ваш ответ. Но там должны быть данные где-то в фиде. Как мне это понять? – MikeTP

+0

См. Править, выше. – SchaunW