Decimal Align Macro

/**********************************************************

*

* Program Name   : dec_align.sas

* Level / Study  :

* Type           : Macro

* Description    : Fix aligment issues

*  

*

* Author         : L McNaught Ltd

* Date Created   : 27OCT2017

* Program Status : Draft

*

*

**********************************************************

* Amended        :

* Date Amended   :

* Amended By     :

**********************************************************/

%macro dec_align(dsin=, test=, aval=, dsout=);

proc sql noprint;

select type

into: type

from sashelp.vcolumn

where libname= "WORK" and memname= %upcase("&dsin") and name= %upcase("&aval");

quit;

data check;

set &dsin. %if &type = num %then %do;(rename=(&aval=test))%end;;

n= _n_;

%if &type = num %then %do;

&aval= strip(put(test, best.));

%end;

run;

data check1;

set check;

  len= length(&aval);

  dec= find(&aval, ".");

if dec ne 0 then postlen= length(substr(&aval, dec, len)) - 1;

else postlen= .;

if dec ne 0 then prelen= length(substr(&aval, 1, dec)) - 1;

else prelen= length(substr(&aval, 1, len));

run;

proc sql noprint;

select max(prelen)

into: max

from check1;

select count(*)

into: count trimmed

from check1;

quit;

data check1a;

set check1;

max= &max;

if postlen ne . then do;

   maxlen= max + postlen + 1;

   decput= strip(put(maxlen, best.)) || "." || strip(put(postlen, best.));

end;

run;

data &dsout;

set check1a;

length &aval._dec $200;

do i = 1 to &count;

if n= i then do;

if postlen= . then &aval._dec= put(input(&aval, best.), &max..);

else if postlen ne . then do;

&aval._dec= putn(input(&aval,best.), decput);

end;

end;

end;

run;

%mend dec_align;

Previous
Previous

Comparing Old Library to New Library

Next
Next

Covert pdf to txt file (where var names withing [])