ライブラリ参照名をテンポラリで作りたくないときがあります。そんなときにはディレクトリを指定してライブラリ参照名を定義しない使い方があります。古いTipsだけど忘れていた。
SASプログラムとログを解析するユーティリティを開発するための備忘録です。This is a memo to develop utility that analyzes the SAS log.
2025年5月29日木曜日
2025年5月13日火曜日
basename, dirname, nobs
良く使うけど、良く忘れるファイル名の操作のマクロをまとめておきます。DATAステップは使わずにマクロの文だけで作っているのでDATAステップの中でも値をはめこみ易いのです。高度なエディタだとマクロの終端を認識してくれないことがあるので、これらのマクロは最後の方に書きます。
このマクロの弱点は、括弧とか特殊文字がファイル名やディレクトリに混じると文字列の終端が判定できなくてERRORになることです。括弧を含む又は括弧の開始があって終了がないようなときはERRORになるので要注意です。
/* Strip directory and suffix from filenames. */
%macro basename(path);
%local dequotePath orgLength dequoteLength lastSlash x;
%let dequotePath=%sysfunc(dequote(&path));
%let orgLength=%length(&path);
%let dequoteLength=%length(&dequotePath);
%let lastSlash=%sysfunc(findc("&dequotePath", "/", -%length(&dequotePath)));
%let x=%substr(&dequotePath, %eval(&lastSlash));
%quote(&x)
%mend;
/* Strip non-directory suffix from file name */
%macro dirname(path);
%local dequotePath orgLength dequoteLength lastSlash x;
%let dequotePath=%sysfunc(dequote(&path));
%let orgLength=%length(&path);
%let dequoteLength=%length(&dequotePath);
%let lastSlash=%sysfunc(findc("&dequotePath", "/", -%length(&dequotePath)));
%let x=%substr(&dequotePath, 1, %eval(&lastSlash-2));
%quote(&x)
%mend;
/* Return number of obs. */
%macro nobs(mydata);
%local NOBS;
%let NOBS=0;
%if %sysfunc(exist(&mydata)) %then %do;
%let mydataID=%sysfunc(OPEN(&mydata., IN));
%let NOBS=%sysfunc(ATTRN(&mydataID, NOBS));
%let RC=%sysfunc(CLOSE(&mydataID));
%end;
&NOBS
%mend;
登録:
コメント
(
Atom
)
