2009-09-09 78 views
8

如果我有一个格式的数值变量,有没有办法将格式化的值作为字符变量?如何使任意SAS格式的字符变量等于数值变量的格式化值?

例如我想写下如下内容来将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; 

(很明显,我可以写put(i, ddmmyy10.),但我的代码需要为任何格式i恰巧有工作)。

回答

9

VVALUE函数格式使用变量相关的格式传递给它的变量。下面是使用VVALUE代码:

data test; 
    format i ddmmyy10.; 
    i = "10JUN2009"d; 
run; 

data _null_; 
    set test; 
    i_formatted = vvalue(i); 
    put i_formatted; 
run; 

虽然cmjohns解决方案是略快于这个代码,这个代码更简单,因为没有涉及到宏。

+0

+1的当前格式进行格式化的方式:正是我之后所做的。谢谢! – 2010-01-15 22:16:13

3

我能做到这一点与宏代码和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; 
+0

我喜欢通过cmjohns' – 2009-09-10 13:39:45

+0

@Chang Chung我知道这是一个古老的问题,但我被重定向到这里。你有什么理由比cmjohns的解决方案更喜欢这个吗? @Simon同样的问题给你:你为什么称它有点烦躁?它不是100%稳定吗? – Yoh 2011-05-04 18:57:17

+0

@Yohsoog:它的工作原理,它很稳定。我只是希望有一种方法可以做到这一点,而无需查看sashelp.vcolumn。 – 2011-05-05 08:28:06

5

这似乎适用于我试过的一对夫妇。我使用了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 
+0

+1,我接受这个答案,因为它比putn(i,vformat(i))快得多。对于1000万观测值,这种方法需要10秒,而65秒。 – 2009-09-09 13:59:14

7

使用vformat()功能。

/* 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 
*/ 
+0

+1我喜欢这个,并且在现在还不知道putn()或者vformat(),但是我因为性能原因接受了cmjohns的回答。 – 2009-09-09 14:00:01

0

是的,有一个putformatted()函数。实际上,有两个:putc()和putn()。 Putc处理字符格式,putn()数字。您的代码需要查看格式名称(所有字符格式和唯一字符格式均以“$”开头)确定要使用哪种格式。这里是putc将语法(从交互式的帮助):

PUTC(source, format.<,w>) 

参数

source 
is the SAS expression to which you want to apply the format. 

format. 
is an expression that contains the character format you want to apply to source. 

w 
specifies a width to apply to the format. 

Interaction: If you specify a width here, it overrides any width specification 
in the format. 
+0

但是我必须提供这样的格式:问题的关键是要确定是否存在用变量 – 2010-01-14 22:17:04