如何用SAS PROC JSON将数据集维度列转为对象内数组导出?
解决SAS按ID分组导出JSON并将维度列转为数组的问题
要实现按id分组,把同一id下的dimension值整合成JSON数组嵌入对应对象,你可以直接在PROC JSON中结合SAS的BY组处理来完成,不需要额外预处理数据集(当然先排序是必须的)。下面是具体步骤:
步骤1:先对数据集按id和amount排序
因为要按id分组处理,首先需要确保数据集是按id有序的:
proc sort data=test; by id amount; run;
步骤2:使用PROC JSON结合BY组生成目标JSON结构
利用PROC JSON的底层语句(open array、open object、write等),配合BY组的first.id和last.id标记来控制JSON的嵌套结构:
proc json out='/MYPATH/jsontest.json' pretty nosastags; /* 打开外层的JSON数组 */ open array; set test; by id amount; /* 当遇到每个id的第一条记录时,创建新的JSON对象并写入id和amount */ if first.id then do; open object; write key 'id' value id; write key 'amount' value amount; /* 打开dimensions对应的数组 */ write key 'dimensions'; open array; end; /* 将当前行的dimension值写入数组 */ write value dimension; /* 当遇到每个id的最后一条记录时,关闭数组和当前对象 */ if last.id then do; close array; close object; end; /* 关闭外层数组 */ close array; run;
效果验证
执行上述代码后,导出的JSON会和你期望的结构完全一致:
[ { "id": "1", "amount": "x", "dimensions": [ "A", "B", "C" ] }, { "id": "2", "amount": "y", "dimensions": [ "A", "X" ] }, { "id": "3", "amount": "z", "dimensions": [ "C", "K", "X" ] } ]
补充说明
- 这里依赖
first.id和last.id来识别每个分组的起始和结束,所以排序步骤不能省略; pretty参数让输出的JSON格式化更易读,nosastags避免SAS自动添加额外的元数据标签;- 如果你的SAS版本支持(9.4M6及以上),也可以先通过
PROC SQL的STRING_AGG函数将同一id的dimension合并为逗号分隔字符串,再用PROC JSON的相关选项转换为JSON数组,但上面的方法更直接且兼容性更好。
内容的提问来源于stack exchange,提问作者crellee
相关产品推荐
相关产品推荐

