1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| data test;
var1=0;
var_nbr=1;
varnbr=20;
nbr_var=3;
nbrvar=40;
var=5;
output;
run;
proc contents noprint data=test out=test1(keep=name varnum);
run;
data test2 test22(drop=re);
IF _N_ = 1 THEN DO
RE = PRXPARSE("/nbr/");
END;
RETAIN RE;
set test1;
if PRXMATCH(RE,name)>0 then output test2;
else output test22;
run;
%macro tt();
data _null_;
set test2;
call symputx('valorg'||strip(_n_),NAME );
call symputx('valN'||strip(_n_),catt('_',put(varnum,z2.),NAME) );
call symputx('nbr', _n_);
run;
data _null_;
set test22;
call symputx('valorg1'||strip(_n_),NAME );
call symputx('val1N'||strip(_n_),catt('_',put(varnum,z2.),NAME) );
call symputx('nbr1', _n_);
run;
data test_alpha(keep=_:);
set test;
%do i=1 %to &nbr.;
if max(&&valorg&i)<10 then do;
&&valN&i=put(&&valorg&i, 16.6);
&&valN&i='NC';
end;
else &&valN&i=put(&&valorg&i,16.6);
%end;
%do i=1 %to &nbr1.;
&&val1N&i=&&valorg1&i;
%end;
run;
%mend tt;
%tt();
proc contents noprint data=test_alpha out=test_alpha1(keep=name);
run;
proc sql;
select name into: list_name separated by ',' from test_alpha1;
quit;
proc sql;
create table test as select &list_name from test_alpha;
quit;
%macro renommer();
proc sql noprint;
select nliteral(name)
into : vars1 -
from dictionary.columns
where libname='WORK' and memname=upcase("test")
;
%let num_vars=&sqlobs;
proc sql noprint;
select nliteral(prxchange('s/^\_\d+//',-1, name))
into : varsN1 -
from dictionary.columns
where libname='WORK' and memname=upcase("test")
;
proc datasets library = work;
modify test;
rename
%do i = 1 %to &num_vars.;
&&vars&i =&&varsN&i.
%end;
;
run;
quit;
%mend renommer;
%renommer; |
Partager