楼主: 清风习习
4400 7

【求助】请帮忙看看这个宏的问题在哪里(涉及eval,sysfunc,symput) [推广有奖]

  • 0关注
  • 0粉丝

初中生

47%

还不是VIP/贵宾

-

威望
0
论坛币
19 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
150 点
帖子
22
精华
0
在线时间
6 小时
注册时间
2006-8-16
最后登录
2011-5-31

楼主
清风习习 发表于 2009-6-15 15:08:13 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
数据集为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: 语句无效或未按正确顺序使用。


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

扫码加我 拉你入群

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

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

关键词:sysfunc symput eval EVA Fun 帮忙 eval symput sysfunc

回帖推荐

jingju11 发表于2楼  查看完整内容

%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 inconsisten ...

pobel 发表于6楼  查看完整内容

%let statement 和&dsets; 应该在%do block 里。

本帖被以下文库推荐

沙发
jingju11 发表于 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;
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

藤椅
pobel 在职认证  发表于 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;
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

板凳
jingju11 发表于 2009-6-16 09:30:09
3# pobel

Yes. good point. that data _null_ is useless at all.

报纸
jingju11 发表于 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_;

地板
pobel 在职认证  发表于 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 里。

7
jingju11 发表于 2009-6-17 20:57:28
6# pobel

That is so helpful for me. thanks.

8
清风习习 发表于 2009-6-30 15:10:39
谢谢楼上各位

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-26 13:45