【问题标题】:Error when using a Macro variable in DO loop in SAS: Required operator not found in expression在 SAS 的 DO 循环中使用宏变量时出错:在表达式中找不到所需的运算符
【发布时间】:2020-02-11 12:39:42
【问题描述】:

我正在使用 SAS,我需要合并多个表,每个表的名称中都有月份和年份的后缀。要使用的特定表将根据用户定义的开始和结束日期而变化。为了实现这一点,我试图通过宏使用 do 循环来遍历日期范围中的月/年并附加到上一个表中。但是,我遇到了问题(似乎与使用循环中开始/结束年份的宏变量有关)。我收到以下错误:

ERROR: Required operator not found in expression: &start_year. 
ERROR: The %FROM value of the %DO QUOTE_YEAR loop is invalid.
ERROR: Required operator not found in expression: &end_year. 
ERROR: The %TO value of the %DO QUOTE_YEAR loop is invalid.
ERROR: The macro GET_PRICES will stop executing.

这是我提出的一些示例测试代码,它复制了产生上面我试图调试的错误的问题。注意这个例子,我只是在循环这些年。 (我会在解决此问题后添加月份。)

DATA _NULL_;
    FORMAT start_date end_date DATE9.;
    start_date = '01JUL2018'd;
    end_date = '30JUN2019'd;
    CALL SYMPUT('start_date',start_date);
    CALL SYMPUT('end_date',end_date);
RUN;

%MACRO get_prices(start_date, end_date);
    %LET start_year = year(&start_date.);
    %LET end_year = year(&end_date.);
    %LET start_month = month(&start_date.);
    %LET end_month = month(&end_date.);
    DATA test;
        t = 0;
    RUN;
    %DO quote_year = &start_year. %TO &end_year.;
        DATA test2;
            t = &quote_year.;
        RUN;
        PROC APPEND BASE= test DATA= test2;
    %END;
%MEND;

%get_prices(&start_date.,&end_date.);

预期输出是一个包含单列“t”的表,包含 3 行:(0, 2018, 2019)。 (我刚刚包含的 0 值用于初始化要在其上附加的非空表。)当我将宏变量替换为循环值中的开始/结束年份时,代码将起作用。

不起作用

%DO quote_year = &start_year. %TO &end_year.;

作品

%DO quote_year = 2018 %TO 2019;

我不知道是什么导致了这个失败。我相信它一定与我定义宏变量的方式有关,但奇怪的是,如果我完全删除 do 循环并在 %LET 语句下具有以下数据步骤,则值会按预期显示。

DATA test_macro_values;
    s = &start_year.;
    t = &end_year.;
    u = &start_month.;
    v = &end_month.;
RUN;

谁能看出发生了什么问题?

【问题讨论】:

    标签: error-handling sas sas-macro


    【解决方案1】:

    没有名为yearmonth 的宏函数。你应该使用%sysfunc:

    %LET start_year = %sysfunc(year(&start_date.));
    %LET end_year = %sysfunc(year(&end_date.));
    %LET start_month = %sysfunc(month(&start_date.));
    %LET end_month = %sysfunc(month(&end_date.));
    

    【讨论】:

    • 有趣...这对我有用。但是,我必须问一个问题,如果您不能在这些 %LET 语句中的 MACRO 中使用普通 SAS 函数,那么如何使用从我的代码中最初定义的那些宏变量中获取的值创建一个简单的数据集? /跨度>
    • @Wolff 它可能有效,因为您使用宏变量生成 SAS 代码,其中 YEAR() 函数将被识别。
    • @Wolff 当你像以前一样初始化宏变量时,这个宏变量的值等于“year(&start_date.)”,所以如果你想在数据步骤中初始化一些变量计算结果写入“variable=&start_year”,然后在data-step中执行计算。如果你想在 %let 语句中初始化时将计算结果存储在宏变量中,你应该使用 %sysfunc。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    相关资源
    最近更新 更多