スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

SAS:処理時間を計るマクロ

SASのログでは、実際に処理時間にどれだけかかったかが分からない。
ので、SASの処理時間を計測するマクロ関数を自作した。
ちなみにパソコンの体内時計を使用しています。

/*------------------------*/
/*-- 使い方 --------------*/
/*------------------------*/
%Timer_Init ; *←自作:タイマーを初期化するための関数 *;

data aaa;
set bbb ;
run ;

%Timer_Stamp ; *←自作:Timer_Initを走らせてから何分経過したかをログに出す *;

data ccc;
set bbb ;
run ;
%Timer_Stamp ; *←連荘使いOK。この場合でもTimer_Initを走らせてからの時間を計測 *;


/*----------------------------------*/
/*-- 自作マクロ関数 ----------------*/
/*----------------------------------*/

* 初期化用 *;
%macro timer_init;
%global __hazime ;

data _null_;
stime=datetime();
call symput("__hazime",compress(put(stime,best.)));
run;
%mend;

* 計測用 *;
%macro timer_stamp;
data _null_;
etime=datetime();
stime=&__hazime.;
int=etime-stime;
put "*** 開始時刻:" stime datetime.;
put "*** 終了時刻:" etime datetime.;
put "*** 処理時間:" int time.;
run;
%mend;
スポンサーサイト

SAS:Split関数もどき

SASで、VBAのSPLIT関数みたいなものを使いたく、SASのヘルプに聞いてみたが、存在しない模様。
その代わり、SCAN関数というものを教えてもらった。
これを使えばSPLIT関数に近いことができる。

SPLIT関数は、区切り文字で文字列を分解することに使える。

SCAN関数: 文字列から区切り文字を指定し、番号順に取り出す
書式: SCAN(,<何個目?>,"<区切り文字>")
--

*----------------------------------------------*
*-- 以下サンプルプログラム --------------------*
*----------------------------------------------*


%let keys = var1 var2 varX ;

/*-- マクロ変数へ出力 --------------*/
data _NULL_ ;
length ccc $1000. ccc2 $1000.;
ccc = "&keys." ;
do i=1 to length(ccc) ;
ccc2 = scan(ccc,i," ");
if ccc2="" then stop ;

n+1;
call symput("varn", compress(put(n,best.))) ;
call symput("var" || compress(put(i,best.)), compress(ccc2)) ;
end ;
run;
*-- チェック・・・マクロ変数をプット --*;
%macro chk;
%do i=1 %to &varn. ;
%put ***&&var&i..***;
%end ;
%mend ;
%chk ;


/*-- データセットへ出力 --------------*/
data tbl ;
length ccc $1000. ccc2 $1000.;
ccc = "&keys." ;
do i=1 to length(ccc) ;
ccc2 = scan(ccc,i," ");
if ccc2="" then stop ;
output ;
end ;

keep ccc2 ;
run;
proc print data=tbl;
run;

SAS:インデックスを消さずにデータ更新する方法

SASで、インデックスや主キーを消さずにデータ更新する方法。
SASにはMySQLのReplace文が無い。(Proc SQLでやってもだめだった)
AppendプロシージャとProc SQLのModifyでやるのも面倒くさい。

ということでSASのサポートに問い合わせてみたところ、以下のようなとっても分かりやすいサンプルを教えてくれたのでメモとして残します。

【インデックスを消さずにデータステップを回す方法】
→ MODIFYステートメントで解決!

/*---------------------------------------------*/
/*-- Sample Program ---------------------------*/
/*---------------------------------------------*/
/* マスターデータセット */
data data0(index=(key1 key2));
input key1 key2 $ value;
datalines;
1 A 100
2 A 200
3 A 300
;
run;

/* トランザクションデータセット */
data data1;
input key1 key2 $ value;
datalines;
3 A 0.01
4 A 0.02
5 A 0.03
;
run;

data data0;
modify data0 data1(rename=(value=temp));*key以外で重複する変数名は一旦リネームする必要がある*;
by key1 key2;
select (_iorc_);*存在する/しないをコントロールするシステム変数*;
/* データが存在する場合、「書き換え」する */
when (%sysrc(_sok)) do;
value=temp;
replace;
end;
/* データが存在しない場合、「追加」する */
when (%sysrc(_dsenmr)) do;
value=temp;
output;
_error_=0;
end;
otherwise do;
put '予期せぬ I/O エラー';
_error_=0;
stop;
end;
end;
run;
/*---------------------------------------------*/

○参考資料
[Modifying a Master Data Set with Observations from a Transaction Data Set]
http://support.sas.com/documentation/cdl/en/basess/58133/HTML/default/a001772743.htm



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。