【发布时间】:2014-04-05 07:37:24
【问题描述】:
我是 SAS 宏编写的新手,我一直在努力为以下实例编写代码。
我有一个由 comp_id 和 date 组合而成的列表,如下所示 -
DATA compno_date_list;
INPUT compno sdate;
DATALINES;
12490 20090120
87432 20090120
24643 20090120
87432 20090119
12490 20090105
24643 20090105
;
现在,这是一个示例列表。我需要在一个非常大的数据集上在这个列表上运行一个巨大的宏。由于为每一行(即 comp_ID - 日期组合)执行此操作将花费大量时间,因此我计划选择唯一日期并创建一个包含所有日期的宏变量。对于此宏变量中的每个日期,我需要创建一个宏变量,其中包含与该日期相关的 comp_ID 列表。因此,我计划运行以下宏来生成“n”个宏变量,其中“n”是日期的总数,如下所示 -
%MACRO GET_MACRO_VARS();
%let j = 1;
%let sdate3 = %scan(&sdate1., &j.);
%do %while(&j.<= &ndate.);
proc sql;
select distinct compno into : n&j.
separated by ' '
from compno_date_list where sdate=&sdate3.;
%let j= &j. + 1;
%let sdate3 = %scan(&sdate1., &j.);
%put &j.;
%put &sdate3.;
%put &(n&j);
%end;
%mend;
%GET_MACRO_VARS();
这里,sdate1 是包含所有唯一日期的宏变量,ndate 是一个包含唯一日期总数的宏变量。
但是如果我运行这段代码,我会从上面宏中的最后 3 %put 语句中的日志文件中获得以下值 -
1 + 1
20090105
&(n1+ 1)
即j 被视为字符变量(?)。为什么会发生这种情况,我该如何纠正? 谢谢!
【问题讨论】:
-
拜托,拜托,不要学习这样写宏。这是一个非常糟糕的编程风格的例子。您几乎不需要编写没有参数的宏;以这种方式可以做的所有事情都可以在没有不必要的宏循环的情况下完成。如果您详细说明为什么要执行上述操作(即,您将如何处理这些宏列表),我很乐意向您展示执行此操作的正确方法。