You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量将SAS带格式列转为格式化值并正确导出至CSV?

SAS格式化列导出CSV时保留文本值的批量处理

问题背景

我有一个应用了列格式的SAS数据集,列的实际值为数值型,在SAS中查询表格时会显示格式对应的文本值,但使用proc export导出CSV时,最初得到的是原始数值而非格式化后的文本。我知道可以用PUT语句转换单列为格式化值,示例代码如下:

data want;
    set have;
    id_fmt = put(id, NAME.);
    
    drop id;
    rename id_fmt=id;
run;

但由于涉及多个表格、大量不同格式的列,我希望找到无需逐个处理的批量方法。

更新:导出异常原因与批量转换宏

我使用以下代码导出CSV:

proc export data=work.want
outfile= "~/test1.csv"
dbms=csv
replace;
run;

后来发现此前导出异常是因为中间代码使用了format _all_;移除了所有格式,重新执行上述导出代码即可正常导出格式化值。在发现该错误前,我已实现一个宏来批量对带格式列执行PUT转换,虽非最优但可正常运行,宏代码如下:

批量转换宏代码

%macro apply_col_format(p_lib=,p_table=,p_column=,p_format=);
DATA _tmp_table;
SET &p_lib..&p_table.;
&p_column._fmt_ = PUT(&p_column., &p_format..);
DROP &p_column.;
RENAME &p_column._fmt_=&p_column.;
RUN;

DATA &p_lib..&p_table.;
SET _tmp_table;
RUN;
%mend;

*setup if not setup prior;
%let outlib=mylib;

/* APPLY FORMATS ON COLUMNS using PUT statement so we get actual values in CSVs*/
proc datasets lib=&outlib. nolist nodetails nolist;
    contents data=_all_  out=work._format_cols NOPRINT ;
run;

PROC SQL; CREATE TABLE format_cols_filter AS 
SELECT libname as p_lib, memname as p_table, name as p_column, format as p_format, formatl 
FROM _format_cols 
WHERE format not in ('','DATE','$','DATETIME') and formatl = 0;

data _format_cols_run;
set format_cols_filter;
arg = CATS('%apply_col_format(p_lib=', p_lib
                        ,',p_table=', p_table
                        ,',p_column=', p_column
                        ,',p_format=', p_format,')');
call execute(arg);
run;

内容的提问来源于stack exchange,提问作者Branko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:03:28