我正在尝试将数据集导出到 JSON 文件。使用 PROC JSON,我的数据集中的每一行都可以很好地导出。 我想做的是使用特定列中的数据在每个导出的对象中添加一个数组。
我的数据集的结构如下:
data test;
input id $ amount $ dimension $;
datalines;
1 x A
1 x B
1 x C
2 y A
2 y X
3 z C
3 z K
3 z X
;
run;
proc json out='/MYPATH/jsontest.json' pretty nosastags;
export test;
run;
显然,导出的 JSON 对象如下所示:
[
{
"id": "1",
"amount": "x",
"dimension": "A"
},
{
"id": "1",
"amount": "x",
"dimension": "B"
},
{
"id": "1",
"amount": "x",
"dimension": "C"
},
...]
我想要的结果:
对于每个 id,我想将维度列中的所有数据插入到一个数组中,这样我的输出就会如下所示:
[
{
"id": "1",
"amount": "x",
"dimensions": [
"A",
"B",
"C"
]
},
{
"id": "2",
"amount": "y",
"dimensions": [
"A",
"X"
]
},
{
"id": "3",
"amount": "z",
"dimensions": [
"C",
"K",
"X"
]
}
]
我无法找到这样的场景或有关如何解决我的问题的一些指南。我希望有人能帮忙。
/克雷利
json 输出还有其他方法,包括
- 数据步骤中的手动编码发射器
- Proc DS2 中的 JSON 包
下面是数据和所需映射的手动编码发射器示例。
data _null_;
file 'c:temptest.json';
put '[';
do group_counter = 1 by 1 while (not end_of_data);
if group_counter > 1 then put @2 ',';
put @2 '{';
do dimension_counter = 1 by 1 until (last.amount);
set test end=end_of_data;
by id amount;
if dimension_counter = 1 then do;
q1 = quote(trim(id));
q2 = quote(trim(amount));
put
@4 '"id":' q1 ","
/ @4 '"amount":' q1 ","
;
put @4 '"dimensions":' / @4 '[';
end;
else do;
put @6 ',' @;
end;
q3 = quote(trim(dimension));
put @8 q3;
end;
if dimension_counter > 1 then put @4 '}';
put @2 ']';
end;
put ']';
stop;
run;
这样的发射器可以宏化和泛化,以处理 data=、by= 和 arrayify= 的规范。 不是推荐给朋友的路径。
您可以在调用proc json
之前尝试连接/分组文本。
我的 SAS 环境中没有proc json
,请尝试此步骤,看看它是否适合您:
data want;
set test (rename=(dimension=old_dimension));
Length dimension $200. ;
retain dimension ;
by id amount notsorted;
if first.amount = 1 then do; dimension=''; end;
if last.amount = 1 then do; dimension=catx(',',dimension,old_dimension); output; end;
else do; dimension=catx(',',dimension,old_dimension); end;
drop old_dimension;
run;
输出:
id=1 amount=x dimension=A,B,C
id=2 amount=y dimension=A,X
id=3 amount=z dimension=C,K,X