I would do the entire library. %macro trimchar(libname=adam,outlib=work); %let libname = %upcase(&libname); %local memlist i w; proc sql; select memname into :memlist separated by ' ' from dictionary.members where libname eq "&LIBNAME" and memtype eq 'DATA' ; quit; run; %put NOTE: &=memlist; %let i = 1; %let w = %scan(&memlist,&i); %do %while(%bquote(&w) ne); data _null_; if 0 then set &libname..&w(keep=_character_); array _c _character_; declare hash h(); h.definekey( '_n_'); length _memname_ _name_ $32 _l_ 8; retain _memname_ "&w"; h.definedata('_memname_','_name_','_l_'); h.definedone(); _l_=0; do _n_ = 1 to dim(_c); _name_ = vname(_c[_n_]); _rc_ = h.add(); end; do until(eof); set &libname..&w(keep=_character_) end=eof; do _n_ = 1 to dim(_c); _rc_ = h.find(); _l_ = _l_ max length(_c[_n_]); _rc_ = h.replace(); end; end; length _dataset_ $256; _dataset_ = cats("&sysmacroname._ol_",put(&i,z3.),'(rename=(_memname_=memname _name_=name _l_=length))'); h.output(dataset:strip(_dataset_)); stop; run; %let i = %eval(&i + 1); %let w = %scan(&memlist,&i); %end; data &sysmacroname._optlen; set &sysmacroname._ol_: open=defer; run; proc sort data=&sysmacroname._optlen; by memname name; run; proc contents data=&libname.._all_ memtype=data out=&sysmacroname._cont(keep=LIBNAME--VARNUM) noprint; run; proc sort data=&sysmacroname._cont; by memname name; run; data &sysmacroname._optcont; update &sysmacroname._cont(in=in1) &sysmacroname._optlen(in=in2); by memname name; run; proc sort data=&sysmacroname._optcont; by libname memname varnum; run; proc print; run; proc format; picture dlen 1-32767='000009' (prefix='$'); run; filename FT59F091 temp; data _null_; file FT59F091; set &sysmacroname._optcont; by libname memname varnum; if first.memname then do; put 'data ' "&outlib" '.' memname '(label=' memlabel:$quote258. ');'; end; put +3 'Attrib ' name @; if type eq 1 then put length= @; else put length=dlen. @; put +(-1) ';'; if last.memname then do; put +3 'set ' libname '.' memname ';'; put +3 'format _character_;'; put +3 'run;'; end; run; proc datasets library=work nolist; delete &sysmacroname._:; run; quit; %inc FT59F091; proc contents data=&outlib.._all_ order=varnum; run; %mend trimchar; options mprint=1; %trimchar(); Message was edited by: data _null_
... View more