SAS:在宏中选择字符串列表

时间:2014-11-18 13:37:53

标签: macros sas

我想循环遍历不同的列表,并根据一个“初始”字符串选择不同的变量集。

示例:我有以下列表和变量集。

%let KRW_list = USD JPY HKD;
%let KRW_vars = FX import export;
%let NZD_list = USD AUD JPY GBP;
%let NZD_vars = FX CA;

现在,如果我有

%let ccy = KRW;

然后我想循环遍历KRW_list中的元素并使用KRW_vars列表中的变量。当然,我可以创建一个将所有3作为参数的宏。但我想要一个只使用ccy作为参数的宏,然后选择正确的字符串列表。我天真地想到了以下几点:

%macro selectlist(ccy1);
%let n = %sysfunc(countw(&ccy1._list));
%do I = 1 %to &n;

proc timeseries data = &ccy1._&ccy2. out= tmp;
.....[some commands] ;
var &ccy1._vars ;
run;
%end;
%mend;

这不起作用。提前谢谢。

1 个答案:

答案 0 :(得分:1)

由于围绕宏变量解析的规则,您的代码无效。如果您设置一个宏变量,而该变量又应该解析为另一个,SAS需要知道它必须解决两次:

%let x_list=a b c;
%let y=x;

%put &y._list;

返回x_list,因为SAS只会将y解析为x,然后无法进一步解析。但是:

%put &&y._list;

首先解析& y到x:

&x_list

然后解析为:

a b c

如果您在代码中将&ccy1.更改为&&ccy1.,那么它应该按照您的意图运行。

如果您打开OPTIONS SYMBOLGEN;(只需在代码中包含此语句),这将显示日志中的宏分辨率步骤,这些步骤可帮助您确定SAS在后台执行的操作。

(运行OPTIONS NOSYMBOLGEN;关闭)