ラベル DICTIONARYテーブル の投稿を表示しています。 すべての投稿を表示
ラベル DICTIONARYテーブル の投稿を表示しています。 すべての投稿を表示

2016年3月29日火曜日

オブザベーション数を取得してマクロ変数に格納する方法 【まとめ】


ぱっと思いつく限りあげてみました。他に面白い方法があれば教えてほしいです。


*** サンプルデータ ;
data DT1;
  do i=1 to 100;
    output;
  end;
run;


① SQL INTO
proc sql noprint;
  select count(*) into :OBS1 trimmed
  from DT1;
quit;

%put &OBS1;


② NOBS
data _NULL_;
  if 0 then set DT1(drop=_ALL_)  nobs=NOBS;
  call symputx("OBS2", NOBS);
  stop;
run;

%put &OBS2;

参照…http://sas-boubi.blogspot.jp/2015/06/blog-post_26.html(過去記事)
※ 注意事項があるので過去記事参照


③ SQL DICTIONARY
proc sql noprint;
  select NLOBS into :OBS3
  from DICTIONARY.TABLES
  /* ライブラリ名とデータセット名を大文字で指定する */
  where LIBNAME="WORK" and MEMNAME="DT1";
quit;

%put &OBS3;

参照…http://sas-boubi.blogspot.jp/2015/08/dictionary.html(過去記事)


④ OPEN, ATTRN関数
data _NULL_;
  DSID = open("DT1");
  OBS  = attrn(DSID, "NLOBSF");
  call symputx("OBS4",OBS);
run;

%put &OBS4;

まず、OPEN関数でデータセットを開く(戻り値としてデータセット識別子というIDが返される)
次に、ATTRN( データセット識別子, "NLOBSF" ) でオブザベーション数を取得しています。


⑤ HASH
data _NULL_;
  if 0 then set DT1;
  dcl hash hs(dataset :"DT1", multidata:"y");
  hs.definekey("i");
  hs.definedone();
  call symputx("OBS5", hs.num_items);
  stop;
run;

%put &OBS5;

参照…http://sas-tumesas.blogspot.jp/2014/07/clearnumitemsdeleteremove.html(データステップ100万回)

ポイント
multidata:"y" で重複キーも保持するようにしています(ハッシュオブジェクトはデフォルトだと、キーが重複するレコードに対して、最初のレコードしか保持しないので)


⑥ SYSNOBS
参照…http://sas-boubi.blogspot.jp/2014/01/blog-post_8902.html(過去記事)


⑦ SQLOBS
参照…http://sas-boubi.blogspot.jp/2014/09/blog-post_8.html(過去記事)

2015年8月26日水曜日

DICTIONARYテーブルで色々な定義情報を取得する




DICTIONARYテーブルには、色々な定義情報が入っています。
(この中身はSQLプロシジャでのみ参照する事ができます。)

SQL使えないよーって人も、DICTIONARYテーブルをビュー化したものが、ライブラリ「SASHELP」の中に入っています。


DICTIONARYテーブルの一覧 (個人的に利用頻度が高いもののみ抜粋)

DICTIONARY
SASHELP内のビュー
中身
COLUMNS
VCOLUMN
変数名と変数属性
MACROS
VMACRO
システムやユーザーが定義しているマクロ変数名
TABLES
VTABLE
データセット名やビュー名
TITLES
VTITLE
タイトルとフットノートの設定
OPTIONS
VOPTION
オプションの設定
INDEXES
VINDEX
インデックスの設定
 ・・・

DICTIONARYテーブルを直接みることは出来ませんが、SASHELP内のビューは開いて見る事が出来ます。



利用方法

* テストデータ ;
data DT1;
   length A B 8. C $20.;
run;

たとえば上記テストデータの変数名や変数属性を取得したいとします。



DICTIONARYテーブルから取得する
proc sql;
   create table OUT1 as
   select *
   from DICTIONARY.COLUMNS
   where LIBNAME="WORK" and MEMNAME="DT1";
quit;


・・・変数多いので省略



SASHELP内のビューから取得する
data OUT2;
   set SASHELP.VCOLUMN;
   where LIBNAME="WORK" and MEMNAME="DT1";
run;