在不使用SAS JSON libname引擎的情况下读取JSON文件
我正在尝试将数据从JSON文件获取到SAS中的表中。不幸的是,我不能使用SAS JSON引擎。 到目前为止,我已经把几乎所有的数据都放到了一个表中。我只是缺少一些值 我的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
{
"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更复杂,更庞大,所以我知道我不会硬编码太多。但我喜欢你解决我问题的办法!谢谢!