2014-09-21 85 views
0

我需要对变量列表执行循环,但不包括其中的某些变量。 我想为每个变量添加一个前缀,除了那些变量。SAS从字典列中排除选择的变量

我写了一个宏:

%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

尝试从该PROC SQL块中删除%put,看看会发生什么。 – Reeza 2014-09-22 02:45:14

回答

1

下面应该工作。使用proc contentsout =而不是字典表。还使用sql separated by语法创建空格分隔的变量列表,而不是单个索引变量。

%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);