前回の投稿で、データセットの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さん有難うございます。
でも会社で、おっきな声でブログが、って言わないでください、、、。
データセットの構造(ディスクリプタ部)のみコピーした空の新規データセットを作成する
data Q1;
attrib
X label='Xのラベル' length=$100.
Y label='Yのラベル' length=8. format=yymmdds10.
;
X='あかさたな';Y=999;output;
run;
といったデータセットがあるとします。
そのデータセットの定義情報を取得するcontentsプロシジャにかけてみると
アウトプットは以下の通りです。
変数と属性の情報コピーし、かつデータ部は空の新規データセットを作成したい、つまりこのデータセットの型だけとって中身はいらない的な場合にどうするかです。
【解法1】
data A1;
set Q1;
stop;
run;
【解法2】
proc sql;
create table A2 like Q1;
quit;
SQLでもかなりシンプルな書き方で作成可能です。
create table 新規データセット名 like コピー元;
で構造のみコピーしてデータセットが作成できます。
attrib
X label='Xのラベル' length=$100.
Y label='Yのラベル' length=8. format=yymmdds10.
;
X='あかさたな';Y=999;output;
run;
といったデータセットがあるとします。
そのデータセットの定義情報を取得するcontentsプロシジャにかけてみると
アウトプットは以下の通りです。
変数と属性の情報コピーし、かつデータ部は空の新規データセットを作成したい、つまりこのデータセットの型だけとって中身はいらない的な場合にどうするかです。
【解法1】
data A1;
set Q1;
stop;
run;
setステートメントで読み込むんだけど、速攻stopステートメントをうつことによって
何も処理させる暇をあたえず作成終了です。
読み込んでから、消したり、抽出が絶対空集合になるような条件でwhereかけてもいいですが
stopが一番わかりやすいです。
stopというとpointによるダイレクトアクセスでファイル終端を見つけられない状態の回避につかう
イメージが強いですが、こんな風にもつかえます。
このようにオブザベーション数が0以外は全く同一のデータセットです。
【解法2】
proc sql;
create table A2 like Q1;
quit;
SQLでもかなりシンプルな書き方で作成可能です。
create table 新規データセット名 like コピー元;
で構造のみコピーしてデータセットが作成できます。
登録:
投稿 (Atom)