我有一个程序应该合并连续编号的任意数量的表。我试图使用宏变量但无济于事。错误"缺少编号数据集列表中的数字后缀"不断涌现。
以下是有缺陷的代码:
DATA INPUTF;
INPUT DSN $;
CARDS;
forum1
forum2
forum3
;
RUN;
DATA forum1;
INPUT contact $ forum1 $;
CARDS;
Mash HERE
Greg HERE
Bob HERE
;
PROC SORT DATA=forum1;
BY contact;
RUN;
DATA forum2;
INPUT contact $ forum2 $;
CARDS;
Mash HERE
Sid HERE
Bob HERE
;
RUN;
PROC SORT DATA=forum2;
BY contact;
RUN;
DATA forum3;
INPUT contact $ forum3 $;
CARDS;
Mash HERE
Sid HERE
Jim HERE
;
RUN;
PROC SORT DATA=forum3;
BY contact;
RUN;
PROC SQL NOPRINT;
SELECT COUNT(*) INTO :n FROM INPUTF;
QUIT;
%MACRO COMBINE(N);
DATA ALLIN;
MERGE forum1-forum&n.;
BY contact;
RUN;
%MEND COMBINE;
%COMBINE;
PROC PRINT DATA=ALLIN;
但是,当我使用%LET语句时,代码工作正常,如下所示:
%let n=3;
DATA ALLIN;
MERGE forum1-forum&n.;
BY contact;
RUN;
PROC PRINT DATA=ALLIN;
问题是我不知道有多少个论坛,我更喜欢这个数字基于输入文件。
任何帮助表示赞赏!谢谢!
答案 0 :(得分:1)
宏变量范围。
您已创建了全局表中存在的宏变量N
。创建宏时,它会带一个参数,也称为N
,它是本地的,未定义的,因为您没有传递有效参数。
使用创建的参数N调用宏,或将proc SQL移动到宏中。
%COMBINE(&N);
OR
%MACRO COMBINE;
PROC SQL NOPRINT;
SELECT COUNT(*) INTO :n FROM INPUTF;
QUIT;
DATA ALLIN;
MERGE forum1-forum&n.;
BY contact;
RUN;
%MEND COMBINE;
%COMBINE;
OR
如果您只有以FORUM开头的表,那么您尝试合并:
DATA ALLIN;
MERGE FORUM: ;
BY contact;
RUN;
答案 1 :(得分:0)
因此,如果数据集InputF具有要合并的数据集列表,则将该列表放入宏变量中。如果您始终至少有两个数据集,则不需要宏逻辑。
proc sql noprint ;
select dsn into :dsnlist separated by ' '
from inputf;
quit;
data allin;
merge &dsnlist ;
by contact;
run;
要处理列表中包含0或1个数据集名称的情况,您需要添加宏逻辑。当只有一个时,你需要使用SET而不是MERGE。您可以使用IFC()函数处理它。
data allin;
%sysfunc(ifc(1=&sqlobs,set,merge)) &dsnlist ;
by contact;
run;