2016年2月24日水曜日

「CALL SET」「FETCHOBS」等で、全変数まとめてマクロ変数に格納する。



全変数まとめて同名のマクロ変数に格納する、あまり知られていない方法。
(最後に注意点の記事リンクも貼っているのでそちらも要確認)





%macro TEST;

   * データセットOPEN ;
   %let _DSID = %sysfunc(open( SASHELP.CLASS ));

   * 変数と同名のマクロ変数をリンクさせる ;
   %syscall set( _DSID );

   * OBSの数だけループ ;
   %do _i = 1 %to %sysfunc(attrn( &_DSID, nlobsf ));

        * 1OBS内の全変数値を同名のマクロ変数に格納 ;
        %let _RC = %sysfunc(fetchobs( &_DSID, &_i ));

        * 格納値をログに出力してみる ;
        %put &NAME &SEX &AGE &HEIGHT &WEIGHT;

   %end;

   * データセットCLOSE ;
   %let _RC = %sysfunc(close( &_DSID ));

%mend;


%TEST;


ログ

ログにマクロ変数値が出力されてますね。


注意点

・数値をマクロ変数にいれると、丸められて元の値と異なる場合があるので注意。
マクロ変数に数値をいれて戻すと誤差がでちゃう場合がある問題について考える話(データステップ100万回)

・変数値を格納したマクロ変数の名前が、一時的に作ったマクロ変数の名前(今回の例では「_DSID」「_i」「_RC」)と被らないように気をつけてくださいね。



関連記事

変数値をマクロ変数に格納する方法「CALL SYMPUTX編」


0 件のコメント:

コメントを投稿