Sas 在datastep中的宏变量上循环

Sas 在datastep中的宏变量上循环,sas,sas-macro,Sas,Sas Macro,我需要在我的数据步骤中循环一些宏变量 我试图定义宏变量并在中动态构建它们 数据步骤如下所示 DATA _NULL_; call symputx('_rbank_1',put(001,z3.)); call symputx('_rwebhost_1','company1.myhost.com'); call symputx('_rbank_2',put(008,z3.)); call symputx('_rwebhost_2','company2.myhost.com'); call

我需要在我的数据步骤中循环一些宏变量 我试图定义宏变量并在中动态构建它们 数据步骤如下所示

DATA _NULL_;
 call symputx('_rbank_1',put(001,z3.));
 call symputx('_rwebhost_1','company1.myhost.com');

 call symputx('_rbank_2',put(008,z3.));
 call symputx('_rwebhost_2','company2.myhost.com');

 call symputx('_rbank_3',put(008,z3.));
 call symputx('_rwebhost_3','company3.myhost.com');

RUN;

%let _rbank_1 = &_rbank_1;
%let _rwebhost_1 = &_rwebhost_1;
%let _rbank_2 = &_rbank_2;
%let _rwebhost_2 = &_rwebhost_2;
%let _rbank_3 = &_rbank_3;
%let _rwebhost_3 = &_rwebhost_3;


data test;
 do cnt=1 to 3;
  macroString=compress("&_rwebhost_"||cnt);
  marcroValue=macroString; 
 end;
run;
但是宏值的输出是“&_rwebhost_3”,我需要它 是值而不是名称

我可以在宏中这样做,但我确实需要在数据步骤中这样做。 通常在其他编程语言中,我会定义一个哈希表
但在sasdatastep中,这似乎并不是那么简单

symput的oposite是symget

data test;
 do cnt=1 to 3;
  macroString=symgetc(cats("_rwebhost_",put(cnt,BEST32.)));
  marcroValue=symgetn(cats("_rbank_",put(cnt,BEST32.)));
  output; 
 end;
run;
使用SYMGET()函数检索名称未知的宏变量的值

%let _rbank_1 = 001;
%let _rwebhost_1 = company1.myhost.com;
%let _rbank_2 = 008;
%let _rwebhost_2 = company2.myhost.com;
%let _rbank_3 = 008;
%let _rwebhost_3 = company3.myhost.com;

data test;
 do cnt=1 to 3;
   bank = symget(cats('_rbank_',cnt));
   webhost= symget(cats('_rwebhost_',cnt));
   put cnt= bank= webhost= ;
 end;
run;
但如果需要数据集变量中的值,则将其存储在数据集中,而不是宏变量中。例如,您可以使用SET语句上的POINT=选项来选择要读取的观测值

data company ;
  input bank $3. webhost $20. ;
cards;
001 company1.myhost.com
008 company2.myhost.com
008 company3.myhost.com
;

data test;
  do cnt=1 to 3;
    set company point=cnt;
    put cnt= bank= webhost= ;
  end;
run;

对我的解决方案的更改非常小。@lee是的。我更详细地说明了如何避免使用宏变量。你是对的,但他给出的代码只是一个例子。大多数情况下,它来自一个更模糊的程序,它会导致其他问题的高度变化。宏“数组”的大多数用法都是编码走了很长一段错误道路的例子。