前回の投稿で、データセットのobs数をマクロ変数に格納する際に
data _NULL_;
set A end=eof;
if eof then call symputx('obs1',_N_);
run;
を提示し、問題点として、データセットが空であった場合、マクロ変数が作成されず
0がとれないと挙げたのですが、
data _NULL_;
call symputx('obs',tobs);
if 0 then set A nobs=tobs;
stop;
run;
このようにすればいいのではないかとご指摘をいただきました。
その通りでした。素晴らしいです。
この場合、1行も読み込むことなくマクロ変数を作成しているので
元データセットが巨大で、obs数をとりたいだけの場合などに
余計な読み込みで処理時間を無駄にすることもなく最強です。
data _NULL_で_N_使うのは確かに無駄でした。反省します。
nobs=で任意の変数にデータセットのobs数を格納することができるのですが
どうもこれ、データステップの開始の時点で格納されるらしく、setステートメントの前、
というかコードの先頭ですでに取得可能なんですね、面妖な、、。
if 0 はif _N_=0 などでもよく、ようは絶対に実行されないif文ですね。
絶対に実行されないif文は、実行はさせないけど、データの定義情報(ディスクリプタ部)を
つかいたい時の方法ですね。知らないと、何してんだこいつ的コードですが。
Sさん有難うございます。
でも会社で、おっきな声でブログが、って言わないでください、、、。
0 件のコメント:
コメントを投稿