在 SAS 的 DO 循环中使用宏变量时出错:在表达式中找不到必需的运算符
Error when using a Macro variable in DO loop in SAS: Required operator not found in expression
我正在使用 SAS,我需要组合多个 table,每个名称的后缀为月份和年份。要使用的具体 tables 将根据用户定义的开始和结束日期而变化。为此,我尝试通过宏使用 do 循环来遍历日期范围内的 months/years 并追加到前一个 table。但是,我遇到了问题(似乎与在循环中使用 start/end 年的宏变量有关)。我收到以下错误:
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 = "e_year.;
RUN;
PROC APPEND BASE= test DATA= test2;
%END;
%MEND;
%get_prices(&start_date.,&end_date.);
预期输出是 table,单列 't',3 行:(0, 2018, 2019)。 (我刚刚包含的 0 值用于初始化要追加的非空 table。)当我将循环值中 start/end 年的宏变量替换为它们的实际值时,代码有效。
不起作用
%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;
谁能看出哪里出了问题?
没有名为 year
和 month
的宏函数。你应该使用 %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.));
我正在使用 SAS,我需要组合多个 table,每个名称的后缀为月份和年份。要使用的具体 tables 将根据用户定义的开始和结束日期而变化。为此,我尝试通过宏使用 do 循环来遍历日期范围内的 months/years 并追加到前一个 table。但是,我遇到了问题(似乎与在循环中使用 start/end 年的宏变量有关)。我收到以下错误:
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 = "e_year.;
RUN;
PROC APPEND BASE= test DATA= test2;
%END;
%MEND;
%get_prices(&start_date.,&end_date.);
预期输出是 table,单列 't',3 行:(0, 2018, 2019)。 (我刚刚包含的 0 值用于初始化要追加的非空 table。)当我将循环值中 start/end 年的宏变量替换为它们的实际值时,代码有效。
不起作用
%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;
谁能看出哪里出了问题?
没有名为 year
和 month
的宏函数。你应该使用 %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.));