我需要在数据步骤中遍历一些宏变量 我试图定义宏变量并在其中动态构建它们 这样的数据步骤
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;
但是macroValue的输出是“&_rwebhost_3”,我需要它 是值而不是名称。
我可以在宏中执行此操作,但我确实需要在数据步骤中执行此操作。 通常用其他编程语言,我会定义一个哈希表 但这在sas datastep中似乎并不那么简单。
答案 0 :(得分:1)
相反的说法是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;
答案 1 :(得分:0)
使用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;