对于任意SAS格式,如何使字符变量等于数值变量的格式化值?

对于任意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

如果我有一个格式为的数值变量,有没有办法将格式值作为字符变量获取

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;
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专栏就能做到的方法。