使用SCANOVER和字符串输入导入.json数据

时间:2014-03-25 15:41:56

标签: json sas

这是我的.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)。怎么样?

1 个答案:

答案 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中。