2011-02-10 53 views
2

我有一些JSON数据,这是其中一个片段:导入从HTML页面JSONP数据,然后输出到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是一个5位游戏代码,我希望从列表中插入(通过循环)。

我最需要的数据是:毛衣,xcoord,teamid,力量,周期,类型,ycoord,时间,玩家名和将游戏代码(xxxxx)插入为列。

因此,这将是:

Gamecode,毛衣,XCOORD,teamid,强度,期限,种类,YCOORD,时间,playername

然后,把它导出所有信息为一(1)CSV文件。

任何人都可以帮助指出我在正确的方向吗?

编辑:

我试图导入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

我从一个URL获取JSON并转换为数据帧中写道an article ,这可能会帮助你开始。

您可以获取在RCurl库利用的getURL()的数据,这样的:

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”,您需要使用类似grep()的东西来解析URL。

一旦你有了你的数据框,你就可以使用write.table()或write.csv()写入CSV。对于很多网址,您必须弄清楚如何将fromJSON()生成的列表合并到一个数据框中。

+0

太棒了,谢谢!所以对于“强度”,它会是:j.df < - data.frame(strength = sapply(j.list,function(x)x $ strength))? – NeilG 2011-02-11 01:52:07

1

有R的功能和用于读取URL任何东西(见帮助(download.file),也是rjson包上CRAN处理JSON数据。可能需要一些调整,如果它真的JSONP。

对于类似的例子,看看我的GEONAMES包 - 。从geonames.org读取JSON数据,构建数据帧

如果它不是在CRAN那么它在R-Forge的我忘了..