如何批量将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
相关产品推荐
相关产品推荐

