SAS单数据步内动态调用自定义格式执行PUT输出的技术挑战
解决SAS单数据步中按每条记录指定的格式执行PUT语句的问题
这个问题我之前也碰到过,确实有点 tricky——SAS的PUT函数默认不支持直接用数据步变量传递格式名,咱们得换个思路,用宏解析配合resolve函数来搞定,而且完全能在单个数据步内完成,不用拆分数据步或者用%DO循环。
核心解决方案代码
直接修改你的data b数据步就行,替换成下面的代码:
data b; set a; * 动态生成并执行PUT格式转换; res = resolve(cats('%sysfunc(putc(', var, ',', fmt, '))')); run;
原理解释
为什么直接res=put(var,fmt)不行?因为PUT函数的格式参数要求是编译时就能确定的字面量格式名,而fmt是数据步运行时才会变化的变量,SAS没法提前识别。
咱们的思路是:
- 用
cats函数把要执行的宏代码拼接成字符串,比如第一条记录会拼成'%sysfunc(putc(FRS,$a.))' - 用
resolve函数解析这个宏字符串,让SAS执行里面的%sysfunc(putc(...))宏调用,最终返回格式化后的结果(也就是FIRST)
如果你的变量是数值型的,只需要把putc换成putn就行。
完整可运行示例
把所有代码放在一起,你可以直接运行验证:
proc format; value $a 'FRS'='FIRST'; value $b 'SCN'='SECOND'; run; data a; length var $3 res $10 fmt $5; var='FRS'; fmt='$a.'; res=''; output; var='SCN'; fmt='$b.'; res=''; output; run; data b; set a; res = resolve(cats('%sysfunc(putc(', var, ',', fmt, '))')); run; * 查看结果; proc print data=b noobs; run;
预期输出
运行后会得到如下结果:
VAR FMT RES FRS $a. FIRST SCN $b. SECOND
内容的提问来源于stack exchange,提问作者stat
相关产品推荐
相关产品推荐

