ラベル ログ の投稿を表示しています。 すべての投稿を表示
ラベル ログ の投稿を表示しています。 すべての投稿を表示

2016年10月13日木曜日

ログに空白行を挿入するSKIPステートメント




ほぼ存在を知られていないであろうSKIPステートメントにスポットライトを当ててみようと思います。


構文

  SKIP 空白行の数;



たとえば 「SKIP 5;」 とすればログに5行空白行を挿入できます。



%put aaa;
skip 5;
%put bbb;


ログ

 70         %put aaa;
 aaa
 
 
 
 
 
 72         %put bbb;
 bbb



役に立つ例ってそんなにないですが、
昔、誰かが作ったマクロを実行したらエラー出まくりだったんで、以下のようにログを確認しやすくする目的で、SKIPを使ったことがありました。



%macro TEST(DS);
   data &DS;
   run;

   skip 3;
%mend;
%TEST(DT1);
%TEST(DT2);
%TEST(DT3);


ログ
 69         %macro TEST(DS);
 70            data &DS;
 71            run;
 72         
 73            skip 3;
 74         %mend;
 75         %TEST(DT1);
 
 NOTE: データセットWORK.DT1は1オブザベーション、0変数です。
 NOTE: DATA ステートメント処理(合計処理時間):
       処理時間           0.00 秒
       ユーザーCPU時間    0.00 秒
       システムCPU時間    0.00 秒
       メモリ             555.43k
       OSメモリ           20384.00k
       タイムスタンプ     2023/11/27 午後04:33:13
       ステップ数                        37  スイッチ数  2
       ページフォルト回数                0
       ページリクレーム回数              107
       ページスワップ回数                0
       自発的コンテキストスイッチ回数    11
       非自発的コンテキストスイッチ回数  0
       ブロック入力操作回数              0
       ブロック出力操作回数              160
       
 
 
 
 
 76         %TEST(DT2);
 
 NOTE: データセットWORK.DT2は1オブザベーション、0変数です。
 NOTE: DATA ステートメント処理(合計処理時間):
       処理時間           0.00 秒
       ユーザーCPU時間    0.00 秒
       システムCPU時間    0.00 秒
       メモリ             556.43k
       OSメモリ           20384.00k
       タイムスタンプ     2023/11/27 午後04:33:13
       ステップ数                        38  スイッチ数  2
       ページフォルト回数                0
       ページリクレーム回数              30
       ページスワップ回数                0
       自発的コンテキストスイッチ回数    10
       非自発的コンテキストスイッチ回数  0
       ブロック入力操作回数              0
       ブロック出力操作回数              160
       
 
 
 
 
 77         %TEST(DT3);
 
 NOTE: データセットWORK.DT3は1オブザベーション、0変数です。
 NOTE: DATA ステートメント処理(合計処理時間):
       処理時間           0.00 秒
       ユーザーCPU時間    0.00 秒
       システムCPU時間    0.00 秒
       メモリ             555.43k
       OSメモリ           20384.00k
       タイムスタンプ     2023/11/27 午後04:33:13
       ステップ数                        39  スイッチ数  2
       ページフォルト回数                0
       ページリクレーム回数              30
       ページスワップ回数                0
       自発的コンテキストスイッチ回数    12
       非自発的コンテキストスイッチ回数  0
       ブロック入力操作回数              0
       ブロック出力操作回数              160
       
 
 
 
 
 78 


上の例では、マクロを3回実行していますが、ログに空白行をいれたことで、なんとなく見やすくなって、、い、、、ますね!



2015年4月15日水曜日

VARINITCHKオプションで、「変数○○は初期化されていません」をWARNINGやERRORにする。

前回の続き。

SAS9.4から、VARINITCHKというオプションが追加されたので、使ってみました。


以下のプログラムを実行すると、、
data DT1;
   length A 8.;
run;

ログ



変数○○は初期化されていません」というログメッセージが、上記のようにNOTEとして出力されます。

ここで、「VARINITCHK=WARN」を指定すると、、
options varinitchk=warn;

data DT1;
   length A 8.;
run;

ログ






初期化メッセージがWARNINGとして出るようになりました。

また「VARINITCHK=ERROR」と指定すると、
options varinitchk=error;

data DT1;
   length A 8.;
run;

ログ







ERRORになり、データステップが中止されるようになります。

設定を最初の状態に戻すには、「VARINITCHK=NOTE」を指定します。
options varinitchk=note;


また、初期化メッセージ自体をログから消すこともできますが、それはしない方がいいので紹介はしないでおきます。
(前回記事で解説した通り、初期化メッセージがプログラムのミスを見つけるのに役立つ事があるので)


会社や人によっては、初期化メッセージをWARNINGやERRORと同じくらいのメッセージとして扱いたいという場合があるので、そういう時にはこのオプションが使えそうです。



2015年4月14日火曜日

「変数○○は初期化されていません」のメッセージは侮れない。



以下をご覧ください。

data DT1;
   length A 8.;
run;

ログ


ログにNOTEとして 「変数Aは初期化されていません」 と出ます。

これは「変数が作成されたのになにも値が与えられていない」ときに出てくるログです。
上の例では「変数Aを定義して作成したのに、なにも値が与えられていない」ということですね。


このように初期化されていない変数は、変数の枠だけ作られて、中身は欠損値になります。
ERRORとかWARNINGじゃないし放っとくか、となるかもしれませんが、このメッセージが役に立つ場合もあります。



たとえば、以下のプログラムを実行して、ログを見てみると、、

data DT2;
   length AAABBB 8.;
   AAABB = 1;
run;

ログ
NOTE: 変数AAABBBは初期化されていません。


初期化されていません」と出てしまいました。
あれ?「length AAABBB 8.」で属性定義した後、ちゃんと「AAABB = 1」で値をセットしてるのに、、、



しかしプログラムをよく見ると、

length AAABBB 8.;
AAABB = 1;


Bの数を1個間違えて書いてたことに気づきます。
このように変数名のタイプミスをしてしまった時などに、この初期化メッセージが気づかせてくれる事があるので、侮れません。
ていうか、私自身、結構やってしまうミスなので、いつも助けられてます。



ちなみに「属性定義だけして、中身は欠損値でいいんだけど、、初期化メッセージが出るのはヤダ。。」といった場合は、欠損値を与える事の出来る CALL MISSING が便利です。

data DT3;
   length A 8. B C $10.;
   call missing( A, B, C );
run;




続く(VARINITCHKオプションで、「変数○○は初期化されていません」をWARNINGやERRORにする。


2014年4月2日水曜日

ログ・アウトプットを外部ファイルに出力する。




「ログウィンドウ」と「アウトプットウィンドウ」の出力内容を、外部ファイルに保存する方法。



方法① PRINTTOプロシジャ


   proc  printto  log    = "保存するログのパスとファイル名.log"
                        print  = "保存するアウトプットのパスとファイル名.lst"   new;
   run;



・上記以降に実行したプログラムのログ・アウトプットが指定したパスに保存されます (「ログウィンドウ」と「アウトプットウィンドウ」には出力されなくなる)

newオプションは、すでに同名ファイルが存在する場合、上書きしてくれる。
   (指定しないと、追加書き込みになる)




最後に、以下を記述してログとアウトプットの出力先をデフォルトに戻しましょう。


   proc printto; run;






方法② DMステートメント


(注意喚起追記)
最近、DMステートメントでログ・アウトプットがうまく保存されない現象が起きました。
詳細不明のため、ご注意ください!



以下ステートメントをプログラムの最後に実行すると、それまでに出力された「ログウィンドウ」と「アウトプットウィンドウ」の中身を指定したパスに保存してくれる。


  dm log       'file "保存するログのパスとファイル名.log"  replace';
  dm output  'file "保存するアウトプットのパスとファイル名.lst"  replace';


replaceは、すでに同名ファイルが存在する場合、上書きしてくれる。



ただしDMステートメントは、、

・バッチ実行下では動作しない。
・すべての環境下で動作するか不明のため、使用する場合は各環境下で動作確認を行ってください。
・「dm output 'file …」という書き方はテキスト形式のアウトプットを保存する方法です。SAS9.3以降アウトプットの形式がデフォルトでHTMLになったため、このまま書いてもうまく動作しません。
プログラムの先頭に「ods listing;」と書いてテキスト形式のアウトプットも出力されるように設定しておく必要があります。





ちなみに以下を記述しておくとSAS上の「ログウィンドウ」と「アウトプットウィンドウ」の中身を初期化(クリア)してくれるので便利。


   dm  log  'clear' ;
   dm  output  'clear' ;




2013年12月24日火曜日

ログに独自のエラーメッセージを表示する。


ログのメッセージは、
「NOTE」「WARNING」「ERROR」の3種類あり、

以下サンプルのように上記キーワードとコロン(:)をつけてPUTすると
ログ上に色つきの独自メッセージを表示できます(キーワードは大文字で記述すること)


サンプルプログラム
data _null_;
  put "NOTE:    独自メッセージ1";
  put "WARNING: 独自メッセージ2";
  put "ERROR:   独自メッセージ3";
run;


ログ



ただし、あくまでNOTE・WARNING・ERRORメッセージっぽい表示をしているだけです。
例えば、この方法でERRORメッセージを出したからといって、データステップを中止させるとか、処理に影響を与える事が出来るわけではありません。



使用例として、以下のように条件によって注意喚起を促したい場合に使える。

*** サンプルデータ ;
data DT1;
input SUBJID$ AGE;
cards;
001 17
002 21
003 16
;
run;

*** 年齢が18歳未満だったら、WARNINGメッセージを表示 ;
data DT2;
 set DT1;
 if AGE<18 then put "WARNING: 18歳未満です。" SUBJID= AGE=;
run;


ログ



自分の書いたメッセージがログに色つきで出るのがなんか楽しい。