对于任意SAS格式,如何使字符变量等于数值变量的格式化值?
如果我有一个格式为的数值变量,有没有办法将格式值作为字符变量获取 e、 g.我想编写如下内容,将对于任意SAS格式,如何使字符变量等于数值变量的格式化值?,sas,Sas,如果我有一个格式为的数值变量,有没有办法将格式值作为字符变量获取 e、 g.我想编写如下内容,将10/06/2009打印到屏幕上,但没有putformatted()函数 data test; format i ddmmyy10.; i = "10JUN2009"d; run; data _null_; set test; i_formatted = putformatted(i); /* How should I write this? */ put i_formatted
10/06/2009
打印到屏幕上,但没有putformatted()
函数
data test;
format i ddmmyy10.;
i = "10JUN2009"d;
run;
data _null_;
set test;
i_formatted = putformatted(i); /* How should I write this? */
put i_formatted;
run;
/* test data */
data test;
i = "10jun2009"d;
format i ddmmyy10.;
run;
/* print out the value using the associated format */
data _null_;
set test;
i_formatted = putn(i, vformat(i));
put i_formatted=;
run;
/* on log
i_formatted=10/06/2099
*/
(显然,我可以编写
put(I,ddmmyy10.)
,但我的代码需要适用于I
碰巧具有的任何格式。)我可以使用宏代码和sashelp.vcolumn
实现这一点,但它有点繁琐
proc sql noprint;
select trim(left(format)) into :format
from sashelp.vcolumn
where libname eq 'WORK' and memname eq 'TEST';
run;
data test2;
set test;
i_formatted = put(i, &format);
put i_formatted;
run;
这似乎对我试过的一对夫妇有效。我使用VARFMT和一个宏函数来检索给定变量的格式
data test;
format i ddmmyy10. b comma12.;
i = "10JUN2009"d;
b = 123405321;
run;
%macro varlabel(variable) ;
%let dsid=%sysfunc(open(&SYSLAST.)) ;
%let varnum=%sysfunc(varnum(&dsid,&variable)) ;
%let fmt=%sysfunc(varfmt(&dsid,&varnum));
%let dsid=%sysfunc(close(&dsid)) ;
&fmt
%mend varlabel;
data test2;
set test;
i_formatted = put(i, %varlabel(i) );
b_formatted = put(b, %varlabel(b) );
put i_formatted=;
put b_formatted=;
run;
这给了我:
i_formatted=10/06/2009
b_formatted=123,405,321
使用vformat()
函数
data test;
format i ddmmyy10.;
i = "10JUN2009"d;
run;
data _null_;
set test;
i_formatted = putformatted(i); /* How should I write this? */
put i_formatted;
run;
/* test data */
data test;
i = "10jun2009"d;
format i ddmmyy10.;
run;
/* print out the value using the associated format */
data _null_;
set test;
i_formatted = putn(i, vformat(i));
put i_formatted=;
run;
/* on log
i_formatted=10/06/2099
*/
是的,有一个putformatted()函数。事实上,有两种:putc()和putn()。Putc处理字符格式,putn()数字。您的代码将需要查看格式名称(所有且仅字符格式以“$”开头),以确定要使用的格式。以下是putc的语法(来自交互式帮助): 函数使用与变量关联的格式格式化传递给它的变量。下面是使用
VVALUE
的代码:
data test;
format i ddmmyy10.;
i = "10JUN2009"d;
run;
data _null_;
set test;
i_formatted = vvalue(i);
put i_formatted;
run;
虽然cmjohns解决方案比这段代码稍微快一点,但这段代码更简单,因为没有涉及宏。+1,我接受这个答案,因为它比putn(I,vformat(I))快得多。对于1000万次观测,这个方法需要10秒,而不是65秒。+1我喜欢这个,以前不知道putn()或vformat(),但出于性能原因,我接受cmjohns的答案。但我必须提供格式:问题的关键是要找出是否有一种方法可以使用当前格式对variable@ChangChung我知道这是一个老问题,但我被转移到了这里。你为什么喜欢这个而不是cmjohns的解决方案@西蒙问你同样的问题:你为什么说它有点烦躁?它不是100%稳定吗?@Yohsoog:它工作正常,而且很稳定。我只是希望有一种不用看sashelp.v专栏就能做到的方法。