如何在SAS中基于政策规则表生成指定格式的JSON字符串
SAS 政策规则JSON生成宏实现方案
常见疑问解答
- 拼接函数选择:使用
cats()更合适,它会自动去除前后空格、无分隔拼接所有入参,正好适配引号、键名、键值的拼接需求;catx()需要指定固定分隔符,不适用于本场景。 - 是否需要
substr():必须使用。每次拼接单条规则后会额外追加逗号作为对象分隔符,最后一条规则末尾的逗号属于非法字符,需要用substr()截取删除。 - 循环设置:不要硬编码循环上限,通过
proc sql动态读取筛选后的规则总数控制循环次数,可适配任意数量的规则输入。
完整可运行宏代码
%let PolicyString = (602,610,639); %macro json; /* 1. 按指定规则编号筛选数据 */ data work.testtable (replace=yes); set work.policytable; where rulenumber in &PolicyString; run; /* 2. 读取规则总数和所有规则字段到宏变量,供后续循环使用 */ proc sql noprint; /* 读取筛选后的规则总条数 */ select count(*) into :rule_cnt from work.testtable; /* 按索引存储每条规则的编号、描述、决策结果 */ select rulenumber, rulelongdesc, decision into :rn1-:rn&rule_cnt, :rd1-:rd&rule_cnt, :dc1-:dc&rule_cnt from work.testtable; quit; /* 3. 初始化存储两类决策JSON的宏变量 */ %local i decline_str review_str rule_obj; %let decline_str = ; %let review_str = ; /* 4. 循环遍历所有规则拼接JSON对象 */ %do i = 1 %to &rule_cnt; /* 拼接单条规则的JSON对象,末尾加逗号作为分隔 */ %let rule_obj = {"RuleNumber":"&&rn&i","RuleText":"&&rd&i"},; /* 按决策类型拼接到对应字符串 */ %if &&dc&i = Decline %then %do; %let decline_str = &decline_str.&rule_obj; %end; %else %if &&dc&i = Review %then %do; %let review_str = &review_str.&rule_obj; %end; %end; /* 5. 处理末尾多余逗号,拼接为合法JSON数组 */ * 处理拒绝类JSON; %if %length(&decline_str) > 0 %then %do; %let decline_str = [%substr(&decline_str, 1, %length(&decline_str)-1)]; %end; %else %do; %let decline_str = []; %end; * 处理复核类JSON; %if %length(&review_str) > 0 %then %do; %let review_str = [%substr(&review_str, 1, %length(&review_str)-1)]; %end; %else %do; %let review_str = []; %end; /* 6. 输出最终JSON字符串 */ %put #################### 输出结果 ####################; %put Decline规则JSON: &decline_str; %put Review规则JSON: &review_str; %put ##################################################; %mend; %json;
输出结果示例
运行宏后日志会输出如下内容:
#################### 输出结果 #################### Decline规则JSON: [{"RuleNumber":"602","RuleText":"Age < 18"},{"RuleNumber":"639","RuleText":"Unknown address"}] Review规则JSON: [{"RuleNumber":"610","RuleText":"False Application"}] ##################################################
内容的提问来源于stack exchange,提问作者Rokob Stervic
相关产品推荐
相关产品推荐

