2026年2月1日日曜日

0件のデータセット作るときに初期化が云々のメッセージって出ないように出来ませんでしたっけ?

変数ラベルや長さなどの変数情報だけを確定させるために0obsのデータセットを作ることがあるのですが、昔はstopステートメントを仕込めば初期化されていませんのメッセージを出さないように出来……ましたよね?0件のデータセット作るときのログに初期化されていませんのメッセージ出るとちょっと嫌だったので……

どうもちょっと前からstopを仕込んでもログに初期化されて~のメッセージが出てる気がするんですよね…そもそも昔からこのメッセージは出ていたのか?手癖で処理していたのでちゃんと覚えてない自分が恨めしい

以下の様に変数aの定義だけ持たせた0件のデータを作成すると、値が無いのでメッセージが出ます

17   data piyo ;

18   attrib  a length = $10 ;

19   run ;

NOTE: 変数aは初期化されていません。  <- これ

NOTE: データセットWORK.PIYOは1オブザベーション、1変数です。

NOTE: DATA ステートメント処理(合計処理時間):

      処理時間           0.03 秒

      CPU時間            0.01 秒


ここに以下の様にデータステップ内にstopステートメントを仕込むと、このメッセージを出なく出来ていた……ような……あいまいな記憶の記事ですみません。気のせいですかね

21   data piyo ;

22   attrib  a length = $10 ;

23   stop ;

24   run ;

NOTE: 変数aは初期化されていません。 <- これが昔は出なかったような…

NOTE: データセットWORK.PIYOは0オブザベーション、1変数です。

NOTE: DATA ステートメント処理(合計処理時間):

      処理時間           0.06 秒

      CPU時間            0.01 秒


2026年1月19日月曜日

データセットがキーとなる変数で重複が無いかを確認する

 キーとなる変数でデータセットが一意に定まるかを確認する時はproc sortを使っています。nouniquekeyオプションを使えば、重複してるレコードをだけをデータセットとして作れるので便利ですね。

仮にデータセットhogeが以下の様にあったとして、変数aの値が1obsと2obsで1で重複しています

後は以下の通り重複するobsをKEY_NO_UNIQUEデータセットに格納して、このデータセットにレコードがあればログにerrorを出す、とすれば重複があるかどうかはログを見るだけでokです。詳しい重複の内容はデータセットを見てください。

proc sort data = hoge out = KEY_NO_UNIQUE nouniquekey  ;

  by a  ;

run ;

data _null_ ;

    if 0 then set KEY_NO_UNIQUE nobs = _nobs ;

    if _nobs ^= 0 then putlog "E" "RROR NoUnique: Check KEY_NO_UNIQUE dataset" ;

    stop ;

run ;