ラベル ステートメント: %PUT の投稿を表示しています。 すべての投稿を表示
ラベル ステートメント: %PUT の投稿を表示しています。 すべての投稿を表示

2022年3月31日木曜日

「PUT "WARNING-"」みたいな書き方。



今回は、以下で紹介した記事のおまけ的内容。


最初に

上の記事のおさらい。

以下サンプルのように「NOTE」「WARNING」「ERROR」のいずれかのキーワードとコロン「:」をつけてPUTすると、ログ上に色つきの独自メッセージを表示できる。

data _null_;
  put "NOTE:    独自メッセージ1";
  put "WARNING: 独自メッセージ2";
  put "ERROR:   独自メッセージ3";
run;

ログ


本題 

上の例でコロン(:)ではなくハイフン(-)に変えると、、

data _null_;
  put "NOTE-    独自メッセージ1";
  put "WARNING- 独自メッセージ2";
  put "ERROR-   独自メッセージ3";
run;

ログ

「NOTE」「WARNING」「ERROR」のキーワード無しで色つきのメッセージを出力できます。


活用例

これは、以下のような使い方が出来ます。

data _null_;
  put "WARNING: 独自メッセージ1";
  put "WARNING- 独自メッセージ1の続き";
run;

ログ

WARNINGメッセージを改行しているように見せることが出来ます。


ただし、1つだけ残念ポイント。

%PUTで同様のテクニックを使おうとすると、、

%put WARNING: 独自メッセージ1;
%put WARNING- 独自メッセージ1の続き;

ログ

ログを見てみると、間にプログラムの文が挟まっていて、WARNINGメッセージが分割されて見えてしまうところ。残念よ。


2017年8月21日月曜日

「PUT」や「%PUT」でログに独自のエラーメッセージを表示するときの定石



海外のプログラムみてるとよくこの書き方してるなーっていう定石を紹介。
まずは以下の記事で、ログに独自のERROR, WARNING, NOTEメッセージを表示する方法を紹介済みなのでご覧下さい。

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



たとえば以下のように、
データステップの場合はPUTを使い、マクロの場合は%PUTを使って独自のログメッセージを表示できます。


データステップの場合
data _null_;
     A = 1;
     if A = 1 then put "ERROR: 変数 A が 1 じゃダメ!!";
run;

ログ
35  data _null_;
36       A = 1;
37       if A = 1 then put "ERROR: 変数 A が 1 じゃダメ!!";
38  run;

ERROR: 変数 A が 1 じゃダメ!!
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.00 秒

マクロの場合
%macro TEST(A=);
     %if "&A" = "1" %then %put ERROR: マクロ変数 A が 1 じゃダメ!!;
%mend;

%TEST(A=1)


ログ
34  %macro TEST(A=);
35       %if "&A" = "1" %then %put ERROR: マクロ変数 A が 1 じゃダメ!!;
36  %mend;
37
38 %TEST(A=1)
ERROR: マクロ 変数 A が 1 じゃダメ!!


ただし、1つ問題があります。

みなさん、プログラム実行後のログに対して 「ERROR」 や 「WARNING」などのキーワードで検索かけて問題となるメッセージがないかを確認しますよね。
その際、上のログ2行目の「35       %if "&A" = "1" %then %put ERROR: マクロ変数 A が 1 じゃダメ!!;」には「ERROR」という文字を含んでいるため検索にひっかかってしまいます。
検索かけたいのは 実際に発生したエラーだけなので、これは無視したいですよね。


そこで以下のように "E" "RROR" という感じで文字を区切って検索にひっかからないようにします。

data _null_;
     A = 1;
     if A = 1 then put "E" "RROR: 変数 A が 1 じゃダメ!!";
run;

ログ
35  data _null_;
36       A = 1;
37       if A = 1 then put "E" "RROR: 変数 A が 1 じゃダメ!!";
38  run;

ERROR: 変数 A が 1 じゃダメ!!
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.00 秒




また%PUTの場合も、 %str(E)RROR と書いて検索にひっかからないようにします。

%macro TEST(A=);
     %if "&A" = "1" %then %put %str(E)RROR: マクロ変数 A が 1 じゃダメ!!;
%mend;

%TEST(A=1)


ログ
34  %macro TEST(A=);
35       %if "&A" = "1" %then %put %str(E)RROR: マクロ変数 A が 1 じゃダメ!!;
36  %mend;
37
38 %TEST(A=1)
ERROR: マクロ 変数 A が 1 じゃダメ!!

%strをダミーで使ってる感じですね。

2016年7月26日火曜日

マクロ言語入門9:マクロ変数とドット




まず今後マクロを使ううえで便利な%PUTステートメントについて紹介します。
以下構文の通り、%PUTステートメントで指定した文字列をログに表示する事が出来ます。



構文

 %PUT   文字列;



例1
%let X = ABCDE;
%put  &X;

ログ
ABCDE

マクロ変数Xの値をログに出力しています。



例2
%let X = ABCDE;
%put  マクロ変数 X に "&X" を指定しました。;

ログ
マクロ変数 X に "ABCDE" を指定しました。

文字列とマクロ変数を組み合わせてログに出力しています。




ドットの活用



以下は例2と同じようなプログラムですが、WARNINGが出てしまいます。

%let X = ABCDE;
%put  マクロ変数 X に&Xを指定しました。;

ログ
WARNING: Xを指定しました。のシンボリック参照を解決できません。


これは 「&Xを指定しました。」 という名前のマクロ変数があるのだと解釈してしまったため、「そんな名前のマクロ変数存在しないぞ!」 というWARNINGです。

「&X」 と 「を指定しました。 」というように分けて解釈させたい場合、マクロ変数名の後に ドット「.」を入れてあげます。


%let X = ABCDE;
%put  マクロ変数 X に&X.を指定しました。;

ログ
マクロ変数 X にABCDEを指定しました。


マクロ変数名の後のドットは展開後に消えます。




ドットの活用2

%let LIB=WORK;
data &LIB.DT1;
   A=1;
run;

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


上記はデータセットDT1を保存するライブラリをマクロ変数LIBで指定するプログラムのつもりです。
しかしログを見ると実際できたデータセットは「WORK.WORKDT1」 となっています。


これは「&LIB.DT1」という文をSASが見たときに、「&LIB.」はマクロ変数の後にドットがついてるから、マクロ変数展開後にドットが消えて「WORKDT1」となってしまうからです。

以下のようにドットを2つ入れてあげると、展開後に1つだけドットが残ります。


%let LIB=WORK;
data &LIB..DT1;
   A=1;
run;
ログ
NOTE: データセットWORK.DT1は1オブザベーション、1変数です。




記事一覧

1. マクロ変数とは
2. マクロの登録と実行
3. 定位置パラメータ
4. キーワードパラメータ
5. クォート処理
6. クォート処理2
7. ループ処理
8. 条件分岐処理
9. ドット
10. &&
11. 演算評価
12. 補足




2014年8月12日火曜日

%PUTステートメントの小技「&=マクロ変数名」


SAS9.3からの機能で、小技というまでもないちょこっとした技です。

 %let  TEST = abcdef ;
 %put  &TEST ;

ログ
abcdef

上記は、%PUTステートメントで、マクロ変数TESTの値をログに出力しています。


ここで、「%PUT &=マクロ変数名;」というふうに書くと、
ログには「マクロ変数名=値」という感じで出力してくれます。

 %put  &=TEST ;

ログ
TEST=abcdef