変数が日付であるかどうかを判断するためのSASコミュニティに関する優れた記事があります。利用可能なのはhereです。あなたの質問は、日付フォーマット(proc format
)のように動作するユーザー定義フォーマットについても忘れてはいけないので、簡単なことではありません。すべての日付変数が1つの形式であるとしましょう。 「
- ライブラリ名、
- データセット名、
- と目的の形式名:は
data test;
format x y z datetime8.;
x = .;
y = .;
z = .;
run;
%macro get_vars_format(lib, tab, fmt);
proc sql noprint;
select name into :names separated by ' '
from sashelp.vcolumn
where libname = "&lib." and
memname = "&tab." and
format eq "&fmt.";
quit;
%put Names: &names.;
data work.test;
set &lib..&tab.;
%let i = 1;
%let name = %scan(&names., &i., %str());
%do %while(&name. ne);
if &name. eq . then &name = 0;
output;
%let i = %eval(&i + 1);
%let name = %scan(&names., &i., %str());
%end;
run;
%mend get_vars_format;
%get_vars_format(lib=WORK, tab=TEST, fmt=DATETIME8.);
このマクロは、3つの引数を取ります。
私は、マクロ変数にすべての変数名を保存しています(彼らはスペース記号で区切られて)、次のステップで、私はループでこれを反復しています(i
とname
マクロ変数に注意してください)。すべての行について、指定された形式の変数の値が.
に等しい場合は、0
に置き換えます。変数に日付形式が指定されている場合、0
はJan 01, 1960
として扱われることに注意してください。これは、SAS日付価値規約の最初の日です。
SASでは、日付変数は数値変数です。したがって、日付変数を識別する方法が必要です。日付変数に日付形式(例:Mmddyy10)が添付されていますか?それはそれらを特定する方法になります。 – Quentin
@ Quentinの答えに加えて、 'vformat'関数を調べて各配列変数のフォーマットを取得します。 'do do'も非難されています。 –