2011-02-10 1 views
2

У меня есть некоторые данные в формате JSON, из которых это фрагмент кода:Импорт данных JSONP из HTML страницы, а затем экспортировать в CSV

{"sweater":"15", "localtime":"7:14 PM", "xcoord":-61, 
    "desc":"John Smith SHOT on Jack Jones", "teamid":10,"strength":701, 
    "pid":8465200,"formalEventId":"TOR8", "period":1, "type":"Shot", "p3name":"", 
    "eventid":8, "p2name":"Jack Jones", "ycoord":21, "pid3":"", "time":"00:38", 
    "playername":"John Smith", "p1name":"John Smith", 
    "video":"2_26_ott_tor_0910_TOR8_save_800K_16x9.flv", "pid2":8469461, "pid1":8465200} 

Я хотел бы, чтобы захватить эту информацию из HTML URL с этим форматом:

http://foo.com/data/20092010/20090xxxxx/PxP.jsonp

где xxxxx - это пятизначный игровой код, который я хотел бы вставить из списка (через цикл).

Данные, которые мне нужны больше всего: свитер, xcoord, teamid, strength, period, type, ycoord, time, playername И, чтобы код игры (xxxxx) был вставлен как столбец.

Так было бы:

Gamecode, свитер, xcoord, TeamID, сила, период, тип, ycoord, время, PlayerName

Тогда у него экспортировать всю информацию в один (1) CSV файл.

Может ли кто-нибудь помочь, указав меня в правильном направлении?

EDIT:

Я пытался импортировать файл JSON в качестве локального файла, используя следующий код:

#libraries 
library(RCurl) 
library(rjson) 
library(bitops) 

#fetch data 
j <- getURL("file:///Desktop/test.jsonp") 

#grab JSON 
j.list <- fromJSON(j) 

#get each data item 
j.df <- data.frame(playername = sapply(j.list, function(x) x$sweater)) 
j.df <- data.frame(xcoord = sapply(j.list, function(x) x$xcoord)) 
j.df <- data.frame(ycoord = sapply(j.list, function(x) x$ycoord)) 
j.df <- data.frame(type = sapply(j.list, function(x) x$type)) 

write.csv(j.df, file="fooPxP.csv") 

и получить пустой файл CSV. Любые идеи, что я делаю неправильно?

Вот некоторые из фактического файла данных из beginining:

loadPlayByPlay({"data":{"refreshInterval":0,"game":{"awayteamid":9,"awayteamname":"Ottawa Senators","hometeamname":"Toronto Maple Leafs","plays":{"play":[{"sweater":"11","localtime":"7:14 PM","xcoord":76,"desc":"Daniel Alfredsson HIT on Tomas Kaberle","teamid":9,"strength":701,"pid":8460621,"formalEventId":"TOR51","period":1,"type":"Hit","p3name":"","eventid":51,"p2name":"Tomas Kaberle","ycoord":-40,"pid3":"","time":"00:16","playername":"Daniel Alfredsson","p1name":"Daniel Alfredsson","pid2":8465200,"pid1":8460621},{"sweater":"15","localtime":"7:14 PM","xcoord":-61,"desc":"Tomas Kaberle SHOT on Pascal Leclaire","teamid":10,"strength":701,"pid":8465200,"formalEventId":"TOR8","period":1,"type":"Shot","p3name":"","eventid":8,"p2name":"Pascal Leclaire","ycoord":21,"pid3":"","time":"00:38","playername":"Tomas Kaberle","p1name":"Tomas Kaberle","video":"2_26_ott_tor_0910_TOR8_save_800K_16x9.flv","pid2":8469461,"pid1":8465200}}}) 

Заранее спасибо!

ответ

2

Я написал an article на извлечение JSON из URL и преобразования в кадр данных , что может помочь вам начать работу.

Вы можете получить данные с помощью GetURL() в библиотеке RCurl, как это:

library(RCurl) 
j <- getURL("http://foo.com/data/20092010/20090xxxxx/PxP.jsonp") 

Далее fromJSON() в rjson пакете должны преобразовать его в список:

library(rjson) 
j.list <- fromJSON(j) 

Затем вы можете создать кадр данных из списка. Например, чтобы получить столбец с именем «свитер», попробуйте:

j.df <- data.frame(sweater = sapply(j.list, function(x) x$sweater)) 

Просто добавьте несколько столбцов в качестве аргументов data.frame() с помощью других ключей в формате JSON.

Чтобы добавить «xxxxx», вам нужно проанализировать URL-адрес, используя что-то вроде grep().

Как только у вас есть свой фрейм данных, вы можете записать его в CSV, используя либо write.table(), либо write.csv(). Для многих URL-адресов вам нужно выяснить, как объединить списки, созданные с помощью функции JSON(), в один фрейм данных.

+0

Awesome, спасибо! Итак, для «силы» это будет: j.df <- data.frame (strength = sapply (j.list, function (x) x $ strength))? – NeilG

+0

Правильно и повторяйте другие клавиши. – neilfws

+0

ОК, поэтому я попробовал это, получил ошибку и понял, что URL-адрес, который я получаю у данных, имеет это до информации: loadPlayByPlay - как мне заставить его «пропустить» это? Или вместо URL-адреса можно импортировать информацию из текстового файла? – NeilG

1

Там в функции R для чтения что-нибудь из URL (см справки (download.file), а также пакет rjson на CRAN для обработки данных в формате JSON. Некоторая подстройка может понадобиться, если его действительно JSONP.

Для аналогичный пример, проверить мой пакет GEONAMES -.. он читает данные в формате JSON из geonames.org и строит кадры данных

Если его не на CRAN, то его на R-Forge забываю ..

0

Запись файла Написание файла в tn для клиента является проблематичным для большинства браузеров из-за ограничений безопасности. В браузере Internet Explorer вы можете записать файл с помощью execCommand - пример в http://4umi.com/web/javascript/filewrite.php.

Перевод json в CSV Я столкнулся с этим преобразованным из json в csv. http://skysanders.net/subtext/archive/2010/09/19/json-to-csv.aspx

Alternative Генерировать преобразование на сервере и загрузить в браузер прямой текст (это мим текст/обычный)