将数组传递到 JSON 文件中的每个对象中.(Proc JSON SAS)



我正在尝试将数据集导出到 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

最新更新