Is there better way than this %macro optimizing_var_len(__dataset=,label_refine=0); %if "&__dataset"^="" and %sysfunc(exist(&__dataset))=1 %then %do; libname temp111 "/SAS_Shared_Data/DATA_DUMPS/optimizing_var_len"; data _null_; if index("&__dataset",'.') then do; call symputx('__lib',scan("&__dataset",1,'.'),'l'); call symputx('__dataset',scan("&__dataset",2,'.'),'l'); end; else call symputx('__lib','work','l'); run; %put &__lib &__dataset; proc contents noprint data=&__lib..&__dataset out=__col; run; proc sql noprint; select cat("max(length(trim(",name,"))) as ",name) into : __char SEPARATED by "," from __col where type=2; select count(name) into : __char_cnt SEPARATED by "," from __col where type=2; select count(name) into : __num_cnt from __col where type=1; quit; %if &__num_cnt>0 %then %do; proc means data=&__lib..&__dataset min max sum stackods ; ods output summary=__mean ; run; %end; %else %do; data __mean; length variable $8 min max sum 3; delete; run; %end; data mean_slect3 mean_slect4; set __mean; if max(abs(min),abs(max))<=100 and int(sum)=sum then output mean_slect3; else if max(abs(min),abs(max))<=100000 and int(sum)=sum then output mean_slect4; run; %if &__char_cnt>0 %then %do; proc sql; create table o as select &__char from &__lib..&__dataset; quit; proc transpose data=o out=o_t ; run; %end; %else %do; data o_t; length _name_ $10 col1 3; delete; run; %end; %DEL_VAR1: %let __char_len=; %let _len_3=; %let _len_4=; proc sql noprint; select cat(_name_," $",strip(put(col1,best10.))) into: __char_len SEPARATED by " " from o_t; select cat(Variable," 3") into : _len_3 SEPARATED by " " from mean_slect3; select cat(Variable," 4") into : _len_4 SEPARATED by " " from mean_slect4; quit; options varlenchk=nowarn; data temp111.&__dataset ; %if "&__char_len"^="" %then length &__char_len;; set &__lib..&__dataset; %if "&_len_3"^="" or "&_len_4"^="" %then length &_len_3 &_len_4 ;; run; options varlenchk=warn; proc compare base=&__lib..&__dataset compare=temp111.&__dataset outstat=outcompstat(where=(_TYPE_='NDIF' )) nosummary novalues ; ods output CompareSummary(nowarn)=compare_summ ; run; proc sql noprint; select count(1) into: __unequal_var from outcompstat where _BASE_^=0 or _comp_^=0; select count(1) into: __equal_var from outcompstat where _BASE_=0 and _comp_=0; quit; %if &__unequal_var>0 %then %do; proc sql noprint; delete * from mean_slect3 where variable in (select _var_ from outcompstat where _BASE_^=0 or _comp_^=0); delete * from mean_slect4 where variable in (select _var_ from outcompstat _BASE_^=0 or _comp_^=0); quit; %goto del_var1; %end; %else %if &__equal_var=&__num_cnt and %sysfunc(exist(compare_summ))=0 %then %do; proc copy in=temp111 out=&__lib. move ; select &__dataset; run; %end; %if &label_refine=1 %then %do; data _null_; set __col end=last; if _n_=1 then call execute('proc datasets library=&__lib nolist noprint; modify &__dataset ;'); call execute(cat('attrib ',strip(name),' label="',upcase(strip(name)),'";')); if last then call execute(';quit;run;'); run; %end; proc sql; drop table __col, o, o_t, mean_slect3 ,mean_slect4,outcompstat,__mean %if %sysfunc(exist(compare_summ))=1 %then ,compare_summ; %if %sysfunc(exist(temp111.&__dataset))=1 %then ,temp111.&__dataset; ;quit; libname temp111 clear; %end; %else %put WARNING: Invalide dataset &__dataset; %mend optimizing_var_len; %optimizing_var_len(__dataset=j);
... View more