全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
4341 7
2009-06-15
数据集为zhu_20050601至zhu_20050624,其中如zhu_20050604等几个数据集不存在。我想用最基本的data…… set……语句把这些数据集串接,但是如果只是设置简单循环,则因为有不存在的数据集而无法串接。所以我想能不能用%sysfunc先判断一下数据集是否存在,如果存在就执行set。程序如下:

%macro set;
   data zhu;
   set %do i=%eval(20050601) %to %eval(20050624);
      data _null_;
      call symput('id',put(&i,z8.));
      run;
      %let dset=zhu_&id;
      %let dsid=%sysfunc(exist(&dset));
      %if &dsid %then &dset;
      %end;
      ;
   run;
%mend set;

但是这个宏无法执行,日志显示为:
ERROR: 文件“WORK.DATA.DATA”不存在。
NOTE: SAS 系统由于错误而停止了该步的处理。
WARNING: 数据集 WORK.ZHU 可能不完整。该步停止时,共有 0 个观测和 0 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.01 秒
      CPU 时间          0.01 秒

WARNING: 没有解析符号引用 ID。
WARNING: 没有解析符号引用 ID。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.00 秒
      CPU 时间          0.00 秒

NOTE: 由宏变量“DSET”生成行。
1     exer.zhu_20050602
      -----------------
      180
ERROR 180-322: 语句无效或未按正确顺序使用。
NOTE: 由调用宏“SET”生成行。
9                              call symput('id',put(&i,z8.));
                               ----
                               180
ERROR 180-322: 语句无效或未按正确顺序使用。


请各位大侠帮帮忙,看看问题可能出在哪里?万分感谢!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2009-6-15 21:43:17
%macro set_;
%let dsets=;
%local i;
%do i=%eval(20050601) %to %eval(20050624);
data _null_;
call symput(
'id',put(&i,z8.));
run;
%if (%sysfunc(exist(zhu_&id))) %then %let dsets=&dsets zhu_&id;
%put &dsets;
%end;

data zhu;
set &dsets;
run;
%mend set_;
options mprint mlogic symbolgen;
%set_
;
*I am not sure that would be helpful;
*from log, i guess that error was from inconsistence between data step and macro compiling time;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-6-16 08:49:11
%macro set;
   data zhu;
   set %do i=20050601 %to 20050624;
      %let dset=zhu_&i;
      %let dsid=%sysfunc(exist(&dset));
      %if &dsid %then &dset;
      %end;
      ;
   run;
%mend set;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-6-16 09:30:09
3# pobel

Yes. good point. that data _null_ is useless at all.
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-6-16 21:25:46
4# jingju11

contiuning...

%macro sets_;
   %let dsets=;
   data zhu;
       set
           %do i=20050601 %to 20050624;
                   %if (%sysfunc(exist(zhu_&i))) %then %let dsets=&dsets zhu_&i;
           %end;
           &dsets;
  run;
%mend sets_;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-6-17 09:03:43
jingju11 发表于 2009-6-16 21:25
4# jingju11

contiuning...

%macro sets_;
   %let dsets=;
   data zhu;
       set
           %do i=20050601 %to 20050624;
                   %if (%sysfunc(exist(zhu_&i))) %then %let dsets=&dsets zhu_&i;
           %end;
           &dsets;
  run;
%mend sets_;
%let statement 和&dsets;  应该在%do block 里。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群