我需要对变量列表进行循环,但不包括其中的一些变量。 我想为每个变量添加一个前缀,除了那些。
我写了一个宏:
%macro addprefijo(tabla);
proc contents data = labo2.&tabla.;
title 'before renaming'; run;
proc sql;
select nvar into :num_vars
from dictionary.tables
where libname='LABO2' and memname="&tabla";
%put 'num_vars' &num_vars;
select distinct(name) into :var1-:var%trim(%left(&num_vars))
from dictionary.columns
where libname='LABO2' and memname="&tabla" /*and name not in ('cid', 'COUNTY', 'ESTADO') */;
quit;
proc datasets library=LABO2;
modify &tabla;
rename
%do i=1 %to &num_vars.;
&&var&i = &tabla._&&var&i.
%end;
;
quit;
run;
proc contents data=LABO2.&tabla.;
title' after renaming';
run;
%mend;
%addprefijo(A_CLI);
我尝试了评论的内容,但崩溃了,并且没有为所有变量添加前缀。这3个变量不在所有表格中。
我该如何解决?
由于
答案 0 :(得分:1)
以下内容应该有效。使用proc contents
out =
而不是字典表。还使用sql separated by
语法创建一个空格分隔的变量列表,而不是indervidual索引变量。
%macro addprefijo(tabla);
proc contents
data = labo2.&tabla.
out = _a_contents
noprint;
run;
proc sql noprint;
select NAME
into :vars separated by " "
from _a_contents
where NAME not in ('cid', 'COUNTY', 'ESTADO');
quit;
proc datasets library = labo2;
modify &tabla.;
rename
%do i = 1 %to %sysfunc(countw(&vars., %str( )));
%let var = %scan(&vars., &i., %str( ));
&var. = &tabla._&var.
%end;;
quit;
%mend;
%addprefijo(A_CLI);