Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在不使用SAS JSON libname引擎的情况下读取JSON文件_Json_Sas - Fatal编程技术网

在不使用SAS JSON libname引擎的情况下读取JSON文件

在不使用SAS JSON libname引擎的情况下读取JSON文件,json,sas,Json,Sas,我正在尝试将数据从JSON文件获取到SAS中的表中。不幸的是,我不能使用SAS JSON引擎。 到目前为止,我已经把几乎所有的数据都放到了一个表中。我只是缺少一些值 我的JSON文件如下所示: { "eventsLimited":false, "events":[ { "_id":"1", "userId":"1", "timestamp":"2017-05-07T21:37:39.037Z", "detailedE

我正在尝试将数据从JSON文件获取到SAS中的表中。不幸的是,我不能使用SAS JSON引擎。 到目前为止,我已经把几乎所有的数据都放到了一个表中。我只是缺少一些值

我的JSON文件如下所示:

  {  
  "eventsLimited":false,
  "events":[  
    {  
      "_id":"1",
      "userId":"1",
      "timestamp":"2017-05-07T21:37:39.037Z",
      "detailedEvents":[  
        {  
          "eventType":"taskChanged",
          "taskId":"111",
          "changedProperties":[  
            {  
              "property":"totalSecondsSpent",
              "oldValue":0,
              "newValue":3600
            },
            {  
              "property":"totalSecondsEstimate",
              "oldValue":0,
              "newValue":144000
            }
          ]
        }
      ]
    },
    {  
      "_id":"2",
      "userId":"1",
      "timestamp":"2017-05-07T22:31:30.037Z",
      "detailedEvents":[  
        {  
          "eventType":"taskChanged",
          "taskId":"111",
          "changedProperties":[  
            {  
              "property":"totalSecondsSpent",
              "oldValue":3600,
              "newValue":5400
            }
          ]
        }
      ]
    }
  ]
}
data iHave;
    infile 'C:\Users\MyUser\Desktop\MyJSONFile.txt' recfm=n dlm='{}[],';
    input value : $200. @@;

    if value in: ('"count"' '"calls"') then
        delete;
run;

libname iTest 'C:\Users\MyUser\Desktop';

data iTest.iTemp;
    set iHave;
    length name v $ 100;

    if value =: '"_id"' then
        n+1;
    name=scan(value,2,'"','m');
    v=scan(value,-2,'"','m');
    drop value;
run;
我的SAS代码如下所示:

  {  
  "eventsLimited":false,
  "events":[  
    {  
      "_id":"1",
      "userId":"1",
      "timestamp":"2017-05-07T21:37:39.037Z",
      "detailedEvents":[  
        {  
          "eventType":"taskChanged",
          "taskId":"111",
          "changedProperties":[  
            {  
              "property":"totalSecondsSpent",
              "oldValue":0,
              "newValue":3600
            },
            {  
              "property":"totalSecondsEstimate",
              "oldValue":0,
              "newValue":144000
            }
          ]
        }
      ]
    },
    {  
      "_id":"2",
      "userId":"1",
      "timestamp":"2017-05-07T22:31:30.037Z",
      "detailedEvents":[  
        {  
          "eventType":"taskChanged",
          "taskId":"111",
          "changedProperties":[  
            {  
              "property":"totalSecondsSpent",
              "oldValue":3600,
              "newValue":5400
            }
          ]
        }
      ]
    }
  ]
}
data iHave;
    infile 'C:\Users\MyUser\Desktop\MyJSONFile.txt' recfm=n dlm='{}[],';
    input value : $200. @@;

    if value in: ('"count"' '"calls"') then
        delete;
run;

libname iTest 'C:\Users\MyUser\Desktop';

data iTest.iTemp;
    set iHave;
    length name v $ 100;

    if value =: '"_id"' then
        n+1;
    name=scan(value,2,'"','m');
    v=scan(value,-2,'"','m');
    drop value;
run;
这将为我提供如下输出:

  {  
  "eventsLimited":false,
  "events":[  
    {  
      "_id":"1",
      "userId":"1",
      "timestamp":"2017-05-07T21:37:39.037Z",
      "detailedEvents":[  
        {  
          "eventType":"taskChanged",
          "taskId":"111",
          "changedProperties":[  
            {  
              "property":"totalSecondsSpent",
              "oldValue":0,
              "newValue":3600
            },
            {  
              "property":"totalSecondsEstimate",
              "oldValue":0,
              "newValue":144000
            }
          ]
        }
      ]
    },
    {  
      "_id":"2",
      "userId":"1",
      "timestamp":"2017-05-07T22:31:30.037Z",
      "detailedEvents":[  
        {  
          "eventType":"taskChanged",
          "taskId":"111",
          "changedProperties":[  
            {  
              "property":"totalSecondsSpent",
              "oldValue":3600,
              "newValue":5400
            }
          ]
        }
      ]
    }
  ]
}
data iHave;
    infile 'C:\Users\MyUser\Desktop\MyJSONFile.txt' recfm=n dlm='{}[],';
    input value : $200. @@;

    if value in: ('"count"' '"calls"') then
        delete;
run;

libname iTest 'C:\Users\MyUser\Desktop';

data iTest.iTemp;
    set iHave;
    length name v $ 100;

    if value =: '"_id"' then
        n+1;
    name=scan(value,2,'"','m');
    v=scan(value,-2,'"','m');
    drop value;
run;

到目前为止还不错。对于数组中的每个对象,计数器(n)递增1,键和值显示在两个不同的列中

我的问题是我没有正确理解changedProperties数组中的内容。“oldValue”键和“newValue”键的两个值未显示在我的输出中。 例如,“v”列中的第一个新值应为3600

有人知道我如何修复代码,以便正确输出吗? 我认为问题在于数字没有显示在括号内,在我的扫描中,我通过括号内的值进行搜索


/Chris

您的问题来自这样一个事实:您告诉
scan
函数单词是由双引号(
)分隔的,
'm'
修饰符指定连续分隔符以及字符串开头和结尾的分隔符将被考虑,并指示空单词

因此,对于其他键/值对(即,
“键”:“值”
),它起作用是因为第一次
扫描
查找第一个和第二个
”之间的单词,即
,第二次
扫描
向后查找最后一个和最后一个
之间的单词“
,即值;对于
oldValue
newValue
而言,您的值不会被引用,这意味着两个
scan
函数都会找到相同的单词,即键

您可以通过指示分隔符是冒号(
)并删除引号(如果有):

name=dequote(scan(value,1,':','m'));
v=dequote(scan(value,2,':','m'));

如果您在这里的最终目标是将数据转换为标准的表格格式,并且JSON的结构并不比您共享的代码片段复杂多少,那么将单个更复杂的数据步骤硬编码以直接导入可能是合理的

例如


完美的这很有道理。现在开始工作了!你解决了我的问题。非常感谢你的光临。不过,扫描函数的第二个参数是错误的。现在修好了哦,是的。我没有复制你的代码,因为你解释得很好,我自己写的。你的目标是对的,但不幸的是JSON更复杂,更庞大,所以我知道我不会硬编码太多。但我喜欢你解决我问题的办法!谢谢!