*
;
options charcode ;
 /*-------------------------------------------------------------------*/
 /*  Program:  MakeAttr SAS                                           */
 /*  Purpose:  Writes SAS code to recreate a dataset. Useful for      */
 /*                 inserting or modifying variables.                 */
 /*  Notes:    Runs on most (all?) SAS v6.x platforms.                */
 /*            Taken from the Oct92 issue of the PharaSUG newsletter. */
 /*  Updated:  10-Mar-93, GAT                                         */
 /*                 - initial version.                                */
 /*-------------------------------------------------------------------*/


 /*-------------------------*/
 /*  CHANGE THIS TO TASTE.  */
 /*-------------------------*/
%Let DSN = inlib.dsn ;


 /*----------------------*/
 /*  Generate contents.  */
 /*----------------------*/
proc contents data = &DSN noprint out = CONTENTS ;

proc sort data = CONTENTS ;
     by LibName MemName NPos ;


 /*------------------------------------------------*/
 /*  Generate SAS statements to recreate dataset.  */
 /*------------------------------------------------*/
data _null_ ;
     attrib Label length=$40 ;
     set CONTENTS (rename=(Label=tmplabel)) ;
     by LibName MemName ;

     file 'MAKEATTR.INC' ;

     /*-----------------*/
     /*  Dataset name.  */
     /*-----------------*/
     if (first.MemName) then do ;
          dsn = trim(LibName) ?/?/ '.' ?/?/ MemName ;
          put 'data ' dsn ' ;' ;
     end ;

     /*------------------*/
     /*  Variable name.  */
     /*------------------*/
     put @5 'attrib ' Name ' length=' @ ;
     if (Type = 2) then put '$' @;

     /*---------------------------------*/
     /*  Length, informat, and format.  */
     /*---------------------------------*/
     put Length @ ;
     if (InformL = 0) then 
          if (Informat > '') then InformL = Length ;
     if (InformL > 0) then do ;
          Informat = left(Informat) ;
          put ' informat=' Informat +(-1) InformL +(-1) '.' @ ;
     end ;
     if (FormatL > 0) then do ;
          Format = left(Format) ;
          put ' format=' Format +(-1)  FormatL +(-1) '.' @ ;
          if (FormatD > 0) then put FormatD @ ;
     end ;

     /*-------------------*/
     /*  Variable label.  */
     /*-------------------*/
     indx = 1 ;
     chunk = scan(tmplabel, 1, "'") ;
     Label = '' ;
     do while (chunk > '') ;
          Label = left(Label) ?/?/ "''" ?/?/ left(chunk) ;
          indx + 1 ;
          chunk = scan(tmplabel, indx, "'") ;
     end ;
     Label = substr(Label, 3) ;
     put / @10
          'label=''' Label $char40. ''' ;' ;

     if (last.MemName) then do ;
          put @5 "set &DSN ;"
               /
               'run ;' ;
     end ;
run ;

dm 'pgm; inc "makeattr.inc"; zoom on' pgm ;

*
;