マクロ実行時にデータセットの情報を取得する

[OS]ALL
[リリース] 6.12および6.09E以降
[キーワード] BASE MACRO FUNCTION %SYSFUNC

[質問]

SASマクロ機能を使用するSASプログラムを、汎用的に利用したいと考えています。 そのため、マクロの実行時に、扱うSASデータセットの情報を動的に入手できるようにしたいのですが、可能でしょうか。

[回答]

SAS 6.12および6.09E以降で、マクロ関数%SYSFUNCが利用できます。また、SCL関数の一部がDATAステップ中で利用できるようになりました。この機能により、以下のようにマクロ定義中において任意のSASデータセットに存在するオブザベーション数、変数の数などを動的に取得することが可能です。

●マクロ定義例

        %macro obsnvars(ds,nvarsp,nobsp); 
           %global &nvarsp &nobsp; 
           %let dsid = %sysfunc(open(&ds)); 
           %if &dsid %then %do; 
              %let &nobsp  = %sysfunc(attrn(&dsid,NOBS)); 
              %let &nvarsp = %sysfunc(attrn(&dsid,NVARS)); 
              %let rc      = %sysfunc(close(&dsid)); 
              %put &ds は、&nvars 変数で &nobs オブザベーションです。;
           %end; 
           %else %do; 
              %put データセットのオープンに失敗しました。;
              %put %sysfunc(sysmsg()); 
           %end; 
        %mend obsnvars;    

●実行例

        data example; 
           array a a1-a13; 
           do i=1 to 8; 
              output; 
           end; 
        run; 

        %obsnvars(example,nvars,nobs);