【问题标题】:SAS: Selecting string list in macroSAS:在宏中选择字符串列表
【发布时间】:2014-11-18 13:37:53
【问题描述】:

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

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

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

这不起作用。提前致谢。

【问题讨论】:

    标签: macros sas


    【解决方案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;关闭)

    【讨论】:

    • 谢谢!但是,还需要一个 &。见下文: %let ccy = KRW; %let KRW_list = 交易买价; proc timeseries data=test out= test2; id 日期时间间隔=min5 累积=last setmissing=previous align=beg; var &&&ccy._list;运行;
    • 抱歉,我没有 SAS 应用程序来测试这个。很高兴你最终找到了正确的答案!
    猜你喜欢
    • 1970-01-01
    • 2018-09-21
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 2021-10-24
    • 2012-05-21
    • 1970-01-01
    相关资源
    最近更新 更多