ラベル ステートメント: 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メッセージが分割されて見えてしまうところ。残念よ。


2022年2月11日金曜日

「PUT 変数名=」という書き方


PUTステートメントの基本的なテクニックの紹介。


基本的なテクニック

data test;
  set sashelp.class;
  if age=13 then put height=;
run;

ログ
 height=56.5
 height=65.3
 height=62.5

「変数名=」という書き方で、例のように先頭に「変数名=」という書式のテキストを追加できます。



以下のように、ちょっと勿体ない書き方をしがち。


ちょっと勿体ない例

data test;
  set sashelp.class;
  if age=13 then put "height=" height;
run;

ログ
 height=56.5
 height=65.3
 height=62.5

勿体ない!


2019年1月18日金曜日

【小ネタ】put _all_で自動変数を出力したくない。




超小ネタです。


「put _all_;」で全変数値をログに出力することが出来ますが、、

data a;
   a=1;
   b="xx";
   c="yy";
   put _all_;
run;

Log:
a=1 b=xx c=yy _ERROR_=0 _N_=1

自動変数(_ERROR_や_N_など)も出力されてしまいます。



そこで、以下で紹介した方法を使うと
https://sas-boubi.blogspot.com/2015/10/put.html

data a;
   a=1;
   b="xx";
   c="yy";
   put (_all_)(=);
run;

Log:
a=1 b=xx c=yy

何故か自動変数は出なくなります。なんでか知らないけど。


あ、今年もどうぞよろしくお願いいたします!



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年8月15日月曜日

「put _all_」は動くのに、「put _numeric_」や「put _character_」は動かない。


以下のように 「PUT _ALL_;」 で全ての変数値をログに出力する事が出来ます。

* サンプルデータ作成 ;
data DT1;
   A = 1;
   B = "aaa";
   C = 2;
   D = "bbb";
run;

* 変数値の出力 ;
data _NULL_;
   set DT1;
   put _all_;
run;

ログ
A=1 B=aaa C=2 D=bbb _ERROR_=0 _N_=1

「_ERROR_」 や 「_N_」 などSASが内部で持っている自動変数も出力されます。


同じ要領で 「PUT _NUMERIC_;」 で全数値変数、「PUT _CHARACTER_;」 で全文字変数を出力することが出来そうですが、、
data _NULL_;
   set DT1;
   put _numeric_;
   put _character_;
run;

ログ
ERROR: _character_を変数名として使用できません。
ERROR: _numeric_を変数名として使用できません。

ERRORが出てしまいます。
こういう書き方無理なのかというと、以下のように書けばいけます。


全数値変数をログに出力 (自動変数は出力されない)
data _NULL_;
   set DT1;
   put (_numeric_)(=);
run;

ログ
A=1 C=2


全文字変数をログに出力 (自動変数は出力されない)
data _NULL_;
   set DT1;
   put (_character_)(=);
run;

ログ
B=aaa D=bbb



関連記事
PUT (変数名) (出力時の表示法) という書き方

2015年10月27日火曜日

PUT (変数名) (出力時の表示法) という書き方





PUTステートメントで、変数値をログや外部ファイルに出力することができます。
今回はこのPUTステートメントの便利な書き方を紹介します。



以下の構文で、指定した変数すべてに、出力時の表示法を設定できます。

構文
PUT  (変数名1 変数名2 ・・・) (出力時の表示法) ;

または全変数(自動変数以外)を出力対象にしたい場合は

PUT  (_ALL_) (出力時の表示法) ;



例1
data DT1;
  A=1;
  B=2;
  put (_ALL_) (=);
run;

ログ
A=1 B=2

変数にイコール「=」をつけて出力


例2
  put (_ALL_) (=/);

ログ
A=1
B=2

変数にイコール&改行をつけて出力


例3
  put (_ALL_) (+0);

ログ
2

変数値のみ出力


この使い方を覚えてると、ここぞという時にも便利です。

2015年7月30日木曜日

PUT vs PUTLOG


両方ともログに文字を出力するステートメントです。

data _NULL_;
   put "aaa";
   putlog "bbb";
run;


ログ
aaa
bbb


同じ機能なら、PUTLOG 要らないじゃんってなりますが、
FILEス テートメントがあると PUT は外部ファイルへの出力に切り替わります。
一方 PUTLOG は変わらずログへの出力のままです。

data _NULL_;
   file "C:\TEST1.txt";
   put "aaa";
   putlog "bbb";
run;


TEST1.txt
aaa

ログ
bbb


上の例のように外部ファイルとログへの出力を同時進行で行いたい場合に使い分けられるわけです。

2015年7月22日水曜日

PUTステートメントで特定の文字を繰り返す小技


小技というほどでもないかも。
まず以下はログにSASバージョンと日時を表示させるプログラムです。

data _NULL_;
   put "==================================================";
   put " SAS Version  : &SYSVER";
   put " 現在日時      : %sysfunc(datetime(),nldatm20)";
   put "==================================================";
run;

ログ

==================================================
 SAS Version  : 9.4
 現在日時      : 2015/07/22 21:12:00
==================================================

(ちなみに自動マクロ変数 「&SYSVER」 でSASバージョンが取得できます。)


ここで、PUTステートメントを以下の青字部分のように置き換えることができます。

data _NULL_;
   put 50 * "=";
   put " SAS Version : &SYSVER";
   put " 現在日時     : %sysfunc(datetime(),nldatm20)";
   put 50 * "=";
run;


put 50 * "="」で、「=」という文字を50回繰り返し出力しています。


構文はこんな感じ。

  PUT  直後の文字を繰り返す回数  *  "文字";




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;


ログ



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