2017-04-18 4 views
1

2つの異なるフォーマットが定義されています。フォーマットされたフォーマット名を関数の入力として使用します。fcmp

proc format; 
value fmtA 
1 = 3 
2 = 5 
; 
value fmtB 
1 = 2 
2 = 4 
; 
run; 

機能myfun戻り、私はこれは少しよりダイナミックにしたい値

proc fcmp outlib=WORK.pac.funcs; 
    function myfun(n); 
     val = put(n,fmta.); 
     return (val); 
    endsub; 
run; 

- valは関数の入力に基づいて行われます。

EDIT

proc fcmp outlib=WORK.pac.funcs; 
    function myfun(n,myfmt $); 
     if myfmt = 'fmtA' then val = put(n,fmtA.); 
     else if myfmt = 'fmtB' then val = put(n,fmtB.); 
     else val = n; 
     return (val); 
    endsub; 
run; 

data test; 
    n = 2; 
    myfmt = 'fmtA'; 
    output; 
    myfmt = 'fmtB'; 
    output; 
    myfmt = 'fmtC'; 
    output; 
run; 

data test2; 
    set test; 
    /* try to do sth like this */ 
    value = myfun(n,myfmt); 
run; 

このソリューションは、動作します。しかし、それは私が非常に多くの異なるフォーマットを持っているときにチェックの長いリストが必要です。そして、私が入力testデータセットの形式名を見る前に、それは不可能です。

+0

フォーマットタイプに似た文字列を取得し、文字列がいずれかと一致するかどうかを確認する代わりに、フォーマットとして使用するのでは –

+0

を渡されたパラメータに基づいて必要な形式を取得するために、関数内でcase文を追加機能に2つ目のパラメータを追加フォーマットを使用して、フォーマットを使用します。たとえば、fmtAとfmtBは渡すことができる文字列です。 fmtAがfmtAでput関数を追加すると、これらの文字列がcaseステートメントの文字列と比較されます。 caseのステートメントとしてformatを使用します。 –

+0

@SivaprasathV関数に渡される形式は、実際には既存のデータセット列の値に基づいています。私はすべての書式名を知っているわけではありませんが、その関数には列の値(書式になっているはずです)を渡すだけです。 – Lovnlust

答えて

3

PUTN()関数を使用してください。

proc format; 
value fmtA 1 = '3' 2 = '5' ; 
value fmtB 1 = '2' 2 = '4' ; 
value fmtc 1 = '1' 2 = '3' ; 
run; 
data test; 
    do myfmt = 'fmtA.','fmtB.','fmtC.'; 
    do n= 1,2; 
    str = putn(n,myfmt); 
    value = input(str,32.); 
    output; 
    end; 
    end; 
run; 
関連する問題