SYMGET関数でマクロ変数の値を取得する

マクロがあまり得意ではないので、もし誤っている点があればご指摘ください。



%let MA=11;
%let MB=22;
%let MC=33;
%let X=44;

のようにマクロ変数に値が代入されているとします。

そして以下のようなデータセットがあったとします。

data Q1;
X='MA';output;
X='MB';output;
X='MC';output;
run;







そこでXの値に対応するマクロ変数の値を展開したい場合、次のように書けます。

data A1;
 set Q1;
  Y=symget(X);
run;








あるいは

data A1_;
 set Q1;
  Y=resolve('&'||X);
run;

でも可です。resolve関数はより広義的機能をもってたりするので興味のある方は
リファレンスやヘルプをひいてください。

でsymgetの戻りはlength$200がデフォで、つまり文字型ですが

data A2;
 set Q1;
  Y=symgetn(X);
run;

とsymgetn関数にすれば数値で得られます。


また

data A3;
 set Q1;
  Y=symget('X');
run;

とすると







単純にマクロ変数Xを展開するので、上記のようになります。


もう一点ポイントなのですが、

以下のプログラムをみてください

data A4;
 set Q1 end=eof;
 call symputx(cats('MV_',_N_),X);
 if eof then Y=cats("&MV_1","&MV_2","&MV_3");
run;









このプログラムでは、最後のY=のところでマクロ変数を展開することができません。
call symputはデータステップ中にマクロ変数に値を代入できますが、
それはそのデータステップが終了した時点で確定し、普通の方法では同データステップ内で
参照することはできません。

%symdel MV_1 MV_2 MV_3 MA MB MC X;
(※順に実行して確かめている方のために一度マクロ変数を消しています)

ところが

data A5;
 set Q1 end=eof;
 call symputx(cats('MV_',_N_),X);
 if eof then Y=cats(symget("MV_1"),symget("MV_2"),symget("MV_3"));
run;







のように書けば、symputで作成されたマクロ変数を同ステップで参照できます。



0 件のコメント:

コメントを投稿