SAS基础宏之3:ChkDataSet
这个宏就简单了,输入一个或多个数据集,输出1或0,分别表示该数据集是否存在这个宏用于在其他宏中保持robust用的,如果不先确定下数据集是否存在,到时候SAS在log窗口报的错可不是那么好懂
另外,如果有更好的解决我写的宏的方法,欢迎指教
话说我很久之前吭哧吭哧写的一个标准化的宏,后来才发现有proc stdize
所以大家还要多多交流
%macro ChkDataSet(DataSet,FlagDataSetExists);
/**********************************************************************/
/* 此宏用于检查指定的数据集是否存在。其中,DataSet是指定的数据集,若 */
/* 需要指定具体的逻辑库,则采用逻辑库.数据库的格式,可设多个数据集, */
/* 用空格分隔;FlagDataSetExists是标记宏变量名称,=1表示数据集存在, */
/* 否则=No,若指定了多个数据集,则不同位置上的1或0代表相应的数据集是 */
/* 否存在。另外需要注意,第一,当仅指定一个数据集时,若不指定逻辑库名 */
/* 称,而只指定数据集名称,此时若在SAS环境中只包含一个指定的数据集, */
/* 则标记宏变量FlagDataSetExists=1,若包含多个同名的数据集,则会报错;*/
/* 第二,当指定多个数据集时,若不指定逻辑库名称,则默认为WORK逻辑库。 */
/* */
/* 最终得到的是宏变量&FlagDataSetExists,若指定数据集存在,则有 */
/* &FlagDataSetExists=1,否则=0,若为多个数据集,则不同位置上的1或0代 */
/* 表相应的数据集是否存在。 */
/* */
/* Created on 2012.11.16 */
/* Modified on 2012.11.16 */
/**********************************************************************/
/* 检查DataSet的存在性 */
%if &DataSet EQ %STR( ) %then %do;
%put ERROR: The DataSet should not be blank, please check it again.;
%goto exit;
%end;
/* 开始进行计算 */
%global &FlagDataSetExists;
/* 情形一:仅设定一个数据集,此时若省略逻辑库名,则在所有逻辑库中查找同名的数据集并予以报告 */
%if %SYSFUNC(FIND(&DataSet,%STR( ))) EQ 0 %then %do;
/* 检查DataSet的合法性 */
%if %SYSFUNC(FIND(&DataSet,.)) NE 0 %then %do;
%let CDS_LibName=%UPCASE(%SCAN(&DataSet,1,.));
%let CDS_DataSet=%UPCASE(%SCAN(&DataSet,2,.));
%end;
%else %do;
%let CDS_LibName=%STR();
%let CDS_DataSet=%UPCASE(&DataSet);
%end;
%if &CDS_DataSet EQ %STR() %then %do;
%put ERROR: The DataSet should not be blank, please check it again.;
%goto exit;
%end;
%else %if &CDS_LibName NE %STR() %then %do;
%let &FlagDataSetExists=%SYSFUNC(EXIST(&CDS_LibName..&CDS_DataSet.));
%end;
%else %do;
proc sql noprint;
create table CDS_temp as
select * from sashelp.vtable
where memname="&CDS_DataSet";
quit;
proc sql noprint;
select count(*) into :CDS_DataSetNum from CDS_temp;
quit;
%if &CDS_DataSetNum EQ 0 %then %let &FlagDataSetExists=0;
%else %if &CDS_DataSetNum EQ 1 %then %let &FlagDataSetExists=1;
%else %do;
%put ERROR: There could be more than one DataSets with the same name appointed in different libraries, please reassign a LibName first.;
%goto exit;
%end;
%end;
%end;
/* 情形二:设定多个数据集,此时若省略逻辑库名,则默认为WORK逻辑库 */
%else %do;
%SeparateString(InputString=&DataSet,OutputString=CDS_DateSet);
%do CDS_i=1 %to &CDS_DateSet_Num;
/* 检查DataSet的合法性 */
%if %SYSFUNC(FIND(&&CDS_DateSet_Var&CDS_i,.)) NE 0 %then %do;
%let CDS_LibName_&CDS_i.=%UPCASE(%SCAN(&&CDS_DateSet_Var&CDS_i,1,.));
%let CDS_DataSet_&CDS_i=%UPCASE(%SCAN(&&CDS_DateSet_Var&CDS_i,2,.));
%end;
%else %do;
%let CDS_LibName_&CDS_i.=WORK;
%let CDS_DataSet_&CDS_i.=%UPCASE(&&CDS_DateSet_Var&CDS_i);
%end;
%let CDS_FlagDataSetExists_&CDS_i.=%SYSFUNC(EXIST(&&CDS_LibName_&CDS_i...&&CDS_DataSet_&CDS_i.));
%end;
%let &FlagDataSetExists=&&CDS_FlagDataSetExists_1;
%do CDS_j=2 %to &CDS_DateSet_Num;
%let &FlagDataSetExists=&&&FlagDataSetExists.&&CDS_FlagDataSetExists_&CDS_j;
%end;
%end;
/* 如果想要输出结果,请取消下面的注释 */
/*%put &&&FlagDataSetExists;*/
/* 删除不必要的表格 */
proc datasets lib=work nolist;
delete CDS_temp;
quit;
%exit:
%mend;
%macro Demo();
%let DataSet=Gfl_fundcodelist_mgrname Gfl_managersoffund; /* 数据集名称,可设为多个,用空格分隔 */
%let FlagDataSetExists=FlagDataSetExists1; /* 宏变量的名称,注意不能与参数名称相同*/
%ChkDataSet(&DataSet,&FlagDataSetExists);
%put &FlagDataSetExists1;
%mend;
页:
[1]