年末年始の休みを使って、SAS Log Inspectorの機能追加を行いました。マッチングのパターンを追加、修正することが出来ます。
SAS Log Inspectorの機能
- 複数のログファイルからエラー、バグに繋がるNOTEを集計
- 日本語と英語版のメッセージに対応
- Excelファイルにログをチェックした結果をエクスポート
- 任意のチェック項目を検査対象から外すことができる
- Notepadを起動して、該当のログファイルを参照できる
- マッチングパターンを追加、修正できるように機能を追加
SASプログラムとログを解析するユーティリティを開発するための備忘録です。This is a memo to develop utility that analyzes the SAS log.
8 %macro foo(in_ds);
9 proc sort data=&in_ds out=class;
10 by name;
11 run;
12
13 data class;
14 set work.class;
15 keep name;
16 run;
17 %mend;
18
19 %foo(sashelp.class)
NOTE: データセットSASHELP.CLASSから19オブザベーションを読み込みました。
NOTE: データセットWORK.CLASSは19オブザベーション、5変数です。
NOTE: PROCEDURE SORT処理(合計処理時間):
処理時間 0.04 秒
CPU時間 0.01 秒
NOTE: データセットWORK.CLASSから19オブザベーションを読み込みました。
NOTE: データセットWORK.CLASSは19オブザベーション、1変数です。
NOTE: DATAステートメント処理(合計処理時間):
処理時間 0.26 秒
CPU時間 0.01 秒
以下のログの場合は、マクロで囲まれていないプロシージャです。行番号の後にマクロ名称が無ければ、マクロの外側と判断できるのではないでしょうか?
1 proc sort data=sashelp.class out=class2;
2 by name;
3 run;
NOTE: データセットSASHELP.CLASSから19オブザベーションを読み込みました。
NOTE: データセットWORK.CLASS2は19オブザベーション、5変数です。
NOTE: PROCEDURE SORT処理(合計処理時間):
処理時間 0.04 秒
CPU時間 0.03 秒
行番号 %マクロ名;がマクロの開始、行番号 RUN又はQUIT;でマクロを抜けたことを判定できそうです。しかしながら、マクロが入れ子になっていると外側のマクロ名しか拾えません。継続して検討しますが、無理そうです。
/* ----------- DATA Step - Process P1 ----- */
signon p1 sascmd='!sascmd';
rsubmit p1 wait=no;
libname outLib sasesock ":pipe1";
/* create data set - and write to pipe */
data outLib.Intermediate;
do i=1 to 5;
put 'Writing row ' i;
output;
end;
run;
endrsubmit;
rdisplay p1;
/* ----------- DATA Step - Process P2 ----- */
signon p2 sascmd='!sascmd';
rsubmit p2 wait=no;
libname inLib sasesock ":pipe1";
libname outLib "d:\temp";
data outLib.Final;
set inLib.Intermediate;
do j=1 to 5;
put 'Adding data ' j;
n2 = j*2;
output;
end;
run;
endrsubmit;
rdisplay p2;
/* -------------------------------------------- */
こちらは実行したときのログです。
NOTE: Copyright (c) 2002-2010 by SAS Institute Inc., Cary, NC, USA.
NOTE: SAS (r) 9.1 (TS1M3 DBCS3054)
Licensed to XYZ JAPAN,LTD., Site 0041264126.
NOTE: このセッションは NET_SRV プラットフォーム上で実行されています。
NOTE: SAS 9.1.3 Service Pack 4
NOTE: SAS システム初期化処理 :
処理時間 1.43 秒
CPU 時間 0.62 秒
1 /* ----------- DATA Step - Process P1 ----- */
2 signon p1 sascmd='!sascmd';
NOTE: P1 へのリモート接続を開始します。 (SAS Release 9.01.01M3P020206)
NOTE: SASUSER.PROFILE をオープンできません。 WORK.PROFILE を使用します。
NOTE: PROFILE への変更はセッションの終了時に失われます。
NOTE: Copyright (c) 2002-2010 by SAS Institute Inc., Cary, NC, USA.
NOTE: SAS (r) 9.1 (TS1M3 DBCS3054)
Licensed to XYZ JAPAN,LTD., Site 0041264126.
NOTE: このセッションは NET_SRV プラットフォーム上で実行されています。
NOTE: SAS 9.1.3 Service Pack 4
NOTE: SAS システム初期化処理 :
処理時間 0.26 秒
CPU 時間 0.26 秒
NOTE: P1 へのリモート接続を完了しました。
3 rsubmit p1 wait=no;
NOTE: バックグラウンドで P1 へのリモートサブミットが進行中です。
4 rdisplay p1;
5
6 /* ----------- DATA Step - Process P2 ----- */
7
8 signon p2 sascmd='!sascmd';
NOTE: P2 へのリモート接続を開始します。 (SAS Release 9.01.01M3P020206)
NOTE: SASUSER.PROFILE をオープンできません。 WORK.PROFILE を使用します。
NOTE: PROFILE への変更はセッションの終了時に失われます。
NOTE: Copyright (c) 2002-2010 by SAS Institute Inc., Cary, NC, USA.
NOTE: SAS (r) 9.1 (TS1M3 DBCS3054)
Licensed to XYZ JAPAN,LTD., Site 0041264126.
NOTE: このセッションは NET_SRV プラットフォーム上で実行されています。
NOTE: SAS 9.1.3 Service Pack 4
NOTE: SAS システム初期化処理 :
処理時間 0.20 秒
CPU 時間 0.20 秒
NOTE: P2 へのリモート接続を完了しました。
9 rsubmit p2 wait=no;
NOTE: バックグラウンドで P2 へのリモートサブミットが進行中です。
10 rdisplay p2;
11 /* -------------------------------------------- */
options mprint source; proc format; value $DATE8_F "19900401" - "19910331" = "19900401 - 19910331" "19910401" - "19920331" = "19910401 - 19920331" "19920401" - "19930331" = "19920401 - 19930331" "19930401" - "19940331" = "19930401 - 19940331" "19940401" - "19950331" = "19940401 - 19950331" "19950401" - "19960331" = "19950401 - 19960331" "19960401" - "19970331" = "19960401 - 19970331" "19970401" - "19980331" = "19970401 - 19980331" "19980401" - "19990331" = "19980401 - 19990331" "19990401" - "20000331" = "19990401 - 20000331" "20000401" - "20010331" = "20000401 - 20010331" "20010401" - "20020331" = "20010401 - 20020331" "20020401" - "20030331" = "20020401 - 20030331" "20030401" - "20040331" = "20030401 - 20040331" "20040401" - "20050331" = "20040401 - 20050331" "20050401" - "20060331" = "20050401 - 20060331" "20060401" - "20070331" = "20060401 - 20070331" "20070401" - "20080331" = "20070401 - 20080331" "20080401" - "20090331" = "20080401 - 20090331" "20090401" - "20100331" = "20090401 - 20100331" "20100401" - "20110331" = "20100401 - 20110331" "20110401" - "20120331" = "20110401 - 20120331" "20120401" - "20130331" = "20120401 - 20130331" "20130401" - "20140331" = "20130401 - 20140331" "20140401" - "20150331" = "20140401 - 20150331" "20150401" - "20160331" = "20150401 - 20160331" "20160401" - "20170331" = "20160401 - 20170331" "20170401" - "20180331" = "20170401 - 20180331" "20180401" - "20190331" = "20180401 - 20190331" "20190401" - "20200331" = "20190401 - 20200331" "20200401" - "20210331" = "20200401 - 20210331" "20210401" - "20220331" = "20210401 - 20220331" "20220401" - "20230331" = "20220401 - 20230331" "20230401" - "20240331" = "20230401 - 20240331" "20240401" - "20250331" = "20240401 - 20250331" "20250401" - "20260331" = "20250401 - 20260331" "20260401" - "20270331" = "20260401 - 20270331" "20270401" - "20280331" = "20270401 - 20280331" "20280401" - "20290331" = "20280401 - 20290331" "20290401" - "20300331" = "20290401 - 20300331" ; run;
options mprint source;
%macro date_fmt(from=, to=, fmt=, fmtnam=);
%local i tcount;
data _null_;
format from to end yymmddn8.;
from = &from;
end = &to;
tcount = 0;
do while (from < end);
to = intnx('MONTH', from, +11, 'END');
tcount = tcount + 1;
/* マクロ変数を定義 */
value = put(from, &fmt);
macvar = compress("FROM" || put(tcount, BEST.));
call symput(macvar, compress(value));
value = put(to, &fmt);
macvar = compress("TO" || put(tcount, BEST.));
call symput(macvar, compress(value));
call symput("TCOUNT", compress(put(tcount, BEST.)));
/* 次の年を設定 */
from = intnx('MONTH', from, +12);
end;
run;
/* 書式を設定 */
proc format;
value &fmtnam
%do i=1 %to &tcount;
"&&from&i" - "&&to&i" = "&&from&i - &&to&i"
%end;
;
run;
%mend;
%date_fmt(from='1-Apr-1990'd, to=today(), fmt=YYMMN6., fmtnam=$DATE6_F);
%date_fmt(from='1-Apr-1990'd, to=today(), fmt=YYMMDDN8., fmtnam=$DATE8_F);
data _null_;
x = put(today(), yymmddn.);
y = put(x, $DATE8_F.);
z = put(x, $DATE6_F.);
put _all_;
run;
'---
' SASワークスペース・オブジェクトの生成
'---
Set oWrkSp = WScript.CreateObject("SAS.Workspace")
'---
' ランゲージ・サービスの取得
'---
Set oLngSp = oWrkSp.LanguageService
'---
' プログラムの実行
'---
oLngSp.Submit "data class; set sashelp.class; run; proc print; run;"
'---
' ログの表示
'---
MsgBox oLngSp.FlushLog(100000)
'---
' アウトプットの表示
'---
MsgBox oLngSp.FlushList(100000)
'---
' ワークスペースを閉じる
'---
oWrkSp.Close
Set oWrkSp = Nothing
WScript.Quit(0)
エラー: パッケージ …alvPkgDXE2.bpl はバージョンの異なる Delphi または CBuilderで作成されたためインストールできません。