2014年7月18日金曜日

値をマクロ変数に格納する「CALL SYMPUTX」その1




CALL SYMPUTは知ってるけど、CALL SYMPUTXって何?という人も多いかと思います。


共に変数値や値をマクロ変数に格納することが出来ます。
ではどう違うのかというと、、


例1: 文字値をマクロ変数に格納する
data _null_;
   length X $10.;

   X = "abcd";
   call symput("MAC1", X);
   call symputx("MAC2", X);
run;

%put "&MAC1";
%put "&MAC2";

ログ
"abcd      "
"abcd"

変数Xの値をマクロ変数MAC1とMAC2に入れてから%PUTでログにその値を展開してます。
  • CALL SYMPUTはLENGTHの余りを半角スペースとして保持してしまうのに対して、
  • CALL SYMPUTXは両端の半角スペースを取り除いてくれます。


例2: 数値をマクロ変数に格納する
data _null_;
   Y = 123.456;
   call symput("MAC3", Y);
   call symputx("MAC4", Y);
run;

%put "&MAC3";
%put "&MAC4";

ログ
"     123.456"
"123.456"

  • CALL SYMPUTでは数値を文字変換してマクロ変数に格納するので、ログに「NOTE: 以下の箇所で数値を文字値に変換しました」と出力されます。またマクロ変数値の先頭に半角スペースが入ります。
  • CALL SYMPUTXでは文字変換&両端の半角スペースを取り除いて、かつログには文字変換した旨のメッセージは出力されません。


例3: 数値をマクロ変数に格納する際の注意
data _null_;
   Y = 111.111111112;
   call symput("MAC5", Y);
   call symputx("MAC6", Y);
run;

%put "&MAC5";
%put "&MAC6";

ログ
"111.11111111"
"111.11111111"

マクロ変数に格納したら、数値が丸められてしまいました。
小数部分の桁が多くて勝手な丸めがまずい場合は、自分で適切な文字値に変換した値をマクロ変数に格納すると安全です。


次回に続く。


0 件のコメント:

コメントを投稿