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_

    sas-innovate-2024.png

    Available on demand!

    Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.

     

    Register now!

    New Learning Events in April

     

    Join us for two new fee-based courses: Administrative Healthcare Data and SAS via Live Web Monday-Thursday, April 24-27 from 1:00 to 4:30 PM ET each day. And Administrative Healthcare Data and SAS: Hands-On Programming Workshop via Live Web on Friday, April 28 from 9:00 AM to 5:00 PM ET.

    LEARN MORE

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