2015-04-12 92 views
2

我需要将某些JSON转换为机器友好格式(例如CSV,Excel,Stata,SAS),并且我正在使用SAS,因为我的文件很大。SAS导入JSON

的观察一个例子:

{"business_id": "vcNAWiLM4dR7D2nwwJ7nCA", "full_address": "4840 E Indian School Rd\nSte 101\nPhoenix, AZ 85018", "hours": {"Tuesday": {"close": "17:00", "open": "08:00"}, "Friday": {"close": "17:00", "open": "08:00"}, "Monday": {"close": "17:00", "open": "08:00"}, "Wednesday": {"close": "17:00", "open": "08:00"}, "Thursday": {"close": "17:00", "open": "08:00"}}, "open": true, "categories": ["Doctors", "Health & Medical"], "city": "Phoenix", "review_count": 9, "name": "Eric Goldberg, MD", "neighborhoods": [], "longitude": -111.98375799999999, "state": "AZ", "stars": 3.5, "latitude": 33.499313000000001, "attributes": {"By Appointment Only": true}, "type": "business"} 
我一直在使用由 http://support.sas.com/resources/papers/proceedings13/296-2013.pdf推荐的方式

问题是,并非所有的观察结果都有相同的条目。例如,一些观察可能缺少“full_address”。

因此我的示例代码现在

filename data '(filename)'; 
data datatest; * defines dataset; 
infile data lrecl = 32000 truncover scanover; 
input 
    @'"business_id": "' business_id $255. 
    ; 

    business_id = substr(business_id,1,index(business_id,'",')-1); 


    IF INDEX(_INFILE_,'"full_address":') > 0 
    THEN DO;  
     input @'"full_address": "' full_address $255.;  
     full_address = substr(full_address,1,index(full_address,'",')-1); 
    END; 
run; 
proc print data = work.datatest; 
run; 

的问题是代码似乎跳过所有其他观察。我怎样才能防止这种情况发生?

+0

我不会将其作为重复关闭,因为这显示了一个有趣的不同问题,但这与[此问题]非常相似(http://stackoverflow.com/questions/21115091/parse-json-object-in -SAS-宏)。 – Joe

回答

1

你的问题是你的初始输入是通过full_address(因为它吃了255个字符)。你可以这样做:

input 
    @'"business_id": "' business_id $255. +(-254) @ 
    ; 

基本上重置指针回到字段的开头,并允许您寻找下一部分。

你也可以用不同的方式阅读它;如果您有SAS 9.3(我相信),则可以使用PROC GROOVY以更简单的方式读取JSON文件。查看我对this question的回答以获取更多详细信息。

+0

使用PROC GROOVY提交的Groovy代码作为进程所有者运行,并且与任何进程所有者具有相同的资源访问权限(文件系统,网络等)。当SAS代码在多用户服务器(如Stored Process Server)内运行时,Groovy代码对资源的访问可能会导致问题。为了让管理员对此功能进行一些控制,只有关闭NOXCMD选项时,PROC GROOVY才会运行。所有SAS服务器随附NOXCMD选项。 (support.sas.com) –