2015年9月16日水曜日

データステップ外で関数を使えるようにする「%SYSFUNC」その1




%SYSFUNCは、SAS関数やFCMPで定義した関数を、データステップ外で使えるようにしてくれます。
構文は簡単で、使用したい関数を%SYSFUNCで囲むだけ。



構文

%SYSFUNC(  関数  )







データステップ外でSUBSTR関数を使って文字の抽出を行い、ログに出力する例

%put %sysfunc( substr(ABCDE, 2, 3) );

---ログ---
BCD


%let MAC= ABCDE;
%put %sysfunc( substr(&MAC, 2, 3) );

---ログ---
BCD


ポイント
・全ての関数や関数の機能がサポートされてるわけではない。

・文字列を引用符(クオーテーション)で囲む必要がない。
例えば、データステップでは 「SUBSTR("ABCDE", 2, 3)」 というように文字列に引用符を付ける必要がありますが、上の例のように 「SUBSTR(ABCDE, 2, 3)」 と引用符は不要です。




落とし穴


以下の例はエラーが出てうまくいきません。

%let MAC= AB,CDE;
%put %sysfunc( substr(&MAC,2,3) );

ログ
ERROR: %SYSFUNC または %QSYSFUNC マクロ関数で参照されている関数 SUBSTR にある引数は多すぎます。


まず、マクロ変数MACが展開されると、、
%sysfunc( substr(&MAC,2,3) )

以下のようになります。
%sysfunc( substr(AB,CDE,2,3) )

この展開された文字にカンマが含まれてるのが問題で、
SUBSTR関数の中の第1引数が「AB」、第2引数が「CDE」、第3引数が「2」、第4引数が「3」と解釈されちゃってエラーが起きたわけです。



解決法


%BQUOTE関数などのマスク機能を持ったマクロ関数で囲んで、「AB,CDE」の中のカンマを無効化してあげます。

%let MAC= AB,CDE;
%put %sysfunc( substr(%bquote(&MAC),2,3) );

ログ
B,C

%BQUOTE関数ついては以下記事で解説しています
マクロ言語入門6:クォート処理【%BQUOTE関数】



その他注意

以下、データステップ100万回で取り上げられていますが、マクロ変数に結果をいれることで、誤差が出てしまうようなのでご注意下さい。

データステップ100万回 「マクロ変数に数値をいれて戻すと誤差がでちゃう場合がある問題について考える話



その2につづく。。

0 件のコメント:

コメントを投稿