这是我的.json文件的预览:
{
"hash": "d1373fa42e50dac98",
"hash_type": "tba",
"id": "bac8c65c6d50a4fbf129",
"delivered_at": "tba0",
"interactions": [
{
"demographic": {
"gender": "tba"
},
"interaction": {
"schema": {
"version": 3
},
"source": "tba",
"author": {
"username": "tba",
"name": "tba",
"id": tba,
"avatar": "tbag",
"link": "tba",
"language": "en"
},
"type": "tba",
"created_at": "Wed, 12 Mar 2014 18:48:03 +0000",
"received_at": 1394650083.9589,
"content": "\"tba" Dummy text. #tba http://t.co/tba",
"id": "1e3aa16d7563a380",
"link": "tba",
"hashtags": [
"tbaa"
]
},
我想将其导入SAS。例如,导入有关两个“id”值的信息(您可以在预览的开头和结尾处找到它)。我使用过这段代码:
filename data 'Test\test.json';
data datatest;
infile data lrecl = 32000 truncover scanover;
input @'"id":"' id $300. ;
id = substr(id,1,index(id,'",')-1);
run;
不幸的是,这导致输出只包含第一个“id”值(bac8c65c6d50a4fbf129),但不包含第二个值(1e3aa16d7563a380)。怎么样?
答案 0 :(得分:1)
你可能有不一致的间距,我猜。这适用于您的示例,尽管您的初始示例可能根本不起作用。
data test;
infile "d:\temp\jsontest.txt" scanover truncover lrecl=32767;
input @'"id":' id $300.;
id=scan(id,1,'",');
run;
删除第三个引号[文本项目的开头引号] - 这样你就可以捕获整个引用的字符串 - 然后你可以轻松地处理它。在这种情况下,scan
与"并且,分隔符可以很好地删除它们(从技术上来说,它会使用第一个'以及那些分隔符)。如果你取出逗号,你也可以使用dequote
删除它们(使用扫描,或者使用,作为文件的分隔符,或者其他一些东西)。
如果您正在解析Twitter或类似的东西,那么对如何执行此操作有一些很好的解释。例如This blog post显示了如何使用OAuth2,但也向您展示了如何使用PROC GROOVY
来使用正确的JSON解析器来读取JSON而不必滚动自己的解析器(如上所述)。如果您熟悉Groovy,如果您有9.3 +,则可以很容易地将其合并到SAS中。