BookmarkSubscribeRSS Feed
Frank_sas
SAS Employee

The re-sizing utiltiy program is a macro in an attached file.  A second attached file gives an example of invoking the macro.  Good luck!

1 REPLY 1
data_null__
Jade | Level 19

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_

    hackathon24-white-horiz.png

    The 2025 SAS Hackathon has begun!

    It's finally time to hack! Remember to visit the SAS Hacker's Hub regularly for news and updates.

    Latest Updates

    Health and Life Sciences Learning

     

    Need courses to help you with SAS Life Sciences Analytics Framework, SAS Health Cohort Builder, or other topics? Check out the Health and Life Sciences learning path for all of the offerings.

    LEARN MORE

    Discussion stats
    • 1 reply
    • 2776 views
    • 1 like
    • 2 in conversation