|
我又更新了下,放在下面,主要是更新了参数设置
我发现我的主贴竟然修改不了,真奇怪
%macro DropEmptyTables(LibName,DataSet,Filter);
/**********************************************************************/
/* 此宏用于删除指定逻辑库中的空表,也即观测值为零的表格。其中LibName */
/* 是指定逻辑库名称;DataSet是指定的数据集名称;Filter是文件过滤设置,*/
/* =Null时删除全部空表,包含_和%等SQL中like子句的通配符时删除指定前后 */
/* 缀的空表,不包含任何通配符时删除指定空表,若指定表不为空则不删除。 */
/* 注意,若表格不包含任何变量,则无法被删除。 */
/* */
/* 最终指定逻辑库下所有符合条件的空表全部被删除。 */
/* */
/* Created on 2013.8.27 */
/* Modified on 2013.8.27 */
/**********************************************************************/
%if &LibName EQ %STR() %then %let LibName=Work;
%if &Filter EQ %STR() %then %let Filter=_Null_;
/* 给&DataSet加引号,并用逗号分隔 */
%if &DataSet NE %STR() %then %do;
%let DataSet_Quote=%PrxChange(InputString=%UPCASE(&DataSet),PrxString=s/((\w|0-9|_)+)/'$1'/);
%let DataSet_Quote=%SYSFUNC(TRANWRD(&DataSet_Quote,%STR( ),%STR(,)));
%end;
/* 得到指定逻辑库中的数据集列表 */
proc contents data=&LibName.._ALL_ out=DET_temp(keep=libname memname nobs) varnum noprint;
run;
%if %UPCASE(&Filter) EQ _NULL_ %then %do;
proc sql noprint;
select count(distinct memname) into :DET_EmptyTableNum
from DET_temp
where UPCASE(libname) EQ UPCASE("&LibName") AND nobs EQ 0
%if &DataSet NE %STR() %then %do;
AND UPCASE(memname) in (&DataSet_Quote)
%end;
;
quit;
%if &DET_EmptyTableNum EQ 0 %then %do;
%put NOTE: There is no empty table or dataset in the specified library, therefore none of table is dropped.;
%goto exit;
%end;
%else %do;
proc sql noprint;
select distinct memname into :DET_EmptyTableList separated by ' '
from DET_temp
where UPCASE(libname) EQ UPCASE("&LibName") AND nobs EQ 0;
quit;
%end;
%end;
%else %if (%SYSFUNC(FIND(&Filter,_)) NE 0) OR (%SYSFUNC(FIND(&Filter,%)) NE 0) %then %do;
proc sql noprint;
select count(distinct memname) into :DET_EmptyTableNum
from DET_temp
where UPCASE(libname) EQ UPCASE("&LibName") AND
UPCASE(memname) like UPCASE("&Filter") AND nobs EQ 0
%if &DataSet NE %STR() %then %do;
AND UPCASE(memname) in (&DataSet_Quote)
%end;
;
quit;
%if &DET_EmptyTableNum EQ 0 %then %do;
%put NOTE: There is no empty table or dataset in the specified library, therefore none of table is dropped.;
%goto exit;
%end;
%else %do;
proc sql noprint;
select distinct memname into :DET_EmptyTableList separated by ' '
from DET_temp
where UPCASE(libname) EQ UPCASE("&LibName") AND
UPCASE(memname) like UPCASE("&Filter") AND nobs EQ 0;
quit;
%end;
%end;
proc sql noprint;
%do DET_i=1 %to &DET_EmptyTableNum;
%let DET_Dataset=%SCAN(&DET_EmptyTableList,&DET_i);
drop table &LibName..&DET_Dataset;
%end;
quit;
/* 删除不必要的表格 */
proc datasets lib=work nolist;
delete DET_:;
quit;
%exit:
%mend;
%macro Demo();
%let LibName=Work;
%let DataSet=;
%let Filter=a%; /* =Null时删除全部空表;包含_和%等SQL中like子句的通配符时删除指定前后缀的空表,注意此时要加双引号;不包含任何通配符时删除指定空表 */
%DropEmptyTables(&LibName,&DataSet,&Filter);
%mend;
|