2009-09-09 6 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の現在のフォーマットでフォーマットする方法があるかどうかを調べることでした。ありがとうございました! –

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 'の上にこれが好きです。 –

+0

@Chang Chung私はそれが古い質問であることを知っていますが、私はここにリダイレクトされました。あなたがcmjohnsのソリューションよりもこれを好む理由がありますか? @サイモンあなたに同じ質問:なぜあなたはそれをちょっと気にかけますか? 100%安定していませんか? – Yoh

+0

@Yohsoog:それは動作し、安定しています。私はsashelp.vcolumnを見ることなくそれを行う方法があることを期待していました。 –

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万回の観測では、この方法は65秒と比較して10秒かかりました。 –

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の答えを受け入れています。 –

0

はい、putformatted()関数があります。実際には、putc()とputn()の2つがあります。 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

しかし、私はフォーマットを提供する必要があります:質問のポイントは、変数 –

関連する問題