楼主: augustin4
1160 5

请帮忙看看程序哪错了 [推广有奖]

  • 0关注
  • 0粉丝

博士生

12%

还不是VIP/贵宾

-

威望
0
论坛币
416 个
通用积分
1.8536
学术水平
6 点
热心指数
6 点
信用等级
6 点
经验
7707 点
帖子
93
精华
0
在线时间
329 小时
注册时间
2014-1-14
最后登录
2022-12-20

100论坛币
  1. *-------将c盘里的所有csv文件导入---------*;
  2. filename indata pipe "dir c:\*.csv /b";
  3. data vname;
  4. length fname $20.;
  5. infile indata truncover;
  6. input fname $20.;
  7. call symput ('nvars',_n_);
  8. run;
  9. %macro want;
  10. %do i = 1 %to &nvars;
  11. data _null_;
  12. set vname(firstobs = &i obs = &i);
  13. call symput ('file', strip(fname));
  14. run;
  15. proc import
  16. out = %substr(&file,1,%length(&file)-4)
  17. datafile = "c:\&file"
  18. dbms = csv replace;
  19. guessingrows = 32676;
  20. getnames = YES;
  21. run;
  22. %end;
  23. %mend;
  24. %want

  25. *------------依次带入回归过程步中------------*;

  26. %macro LoopReg;
  27. %do i=1 %to &nvars;
  28. data _null_;
  29. set vname(firstobs=&i obs=&i);
  30. call symput("DT",strip(fname));
  31. call symput("file",%substr(&DT,1,%length(&DT)-4));
  32. run;
  33. proc reg data=&file;
  34. model y=x;
  35. run;
  36. %end;
  37. %mend;
  38. %loopreg
复制代码

上面的宏want没有问题,但带入回归过程步就出问题了。

最佳答案

sniperhgy 查看完整内容

带入回归那里出错是因为:在同一个数据集里面,不能调用刚生成的宏变量,因为在编译的时候,那些宏变量已经解析了,所以等于楼主的那个DT还没有值呢。还有一点,楼主曾多次问我为何要有那个点,者可以说是习惯,点代表了解析的结束,养成习惯,比如楼主写带有扩展名的时候,如果%let file=abc; 然后%put &file.xls,那么解析出来的有是abcxls,但是如果写成%put &file..xls解析出来的就是正确的名字abc.xls,这样说很好理解吧? ...
关键词:truncover filename Guessing replace symput replace null 程序 file
沙发
sniperhgy 发表于 2014-10-24 16:50:20 |只看作者 |坛友微信交流群
带入回归那里出错是因为:在同一个数据集里面,不能调用刚生成的宏变量,因为在编译的时候,那些宏变量已经解析了,所以等于楼主的那个DT还没有值呢。还有一点,楼主曾多次问我为何要有那个点,者可以说是习惯,点代表了解析的结束,养成习惯,比如楼主写带有扩展名的时候,如果%let file=abc; 然后%put &file.xls,那么解析出来的有是abcxls,但是如果写成%put &file..xls解析出来的就是正确的名字abc.xls,这样说很好理解吧?

所以改成这样:
  1. %macro LoopReg;
  2.   %do i = 1 %to &nvars.;
  3.     data _null_;
  4.       set vname(firstobs = &i. obs = &i.);
  5.       call symput("file",strip(fname));
  6.     run;
复制代码

已有 1 人评分学术水平 热心指数 收起 理由
augustin4 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

使用道具

藤椅
bullstag 发表于 2014-10-24 21:47:49 |只看作者 |坛友微信交流群
&DT generated by symput after the data step
已有 1 人评分热心指数 收起 理由
augustin4 + 1 精彩帖子

总评分: 热心指数 + 1   查看全部评分

使用道具

板凳
augustin4 发表于 2014-10-24 23:48:26 |只看作者 |坛友微信交流群
sniperhgy 发表于 2014-10-24 16:50
带入回归那里出错是因为:在同一个数据集里面,不能调用刚生成的宏变量,因为在编译的时候,那些宏变量已经 ...
多谢指点!我改成这样就可以了:
  1. *-------将c盘里的所有csv文件导入---------*;
  2. filename indata pipe "dir c:\*.csv /b";
  3. data vname;
  4. length fname $20.;
  5. infile indata truncover;
  6. input fname $20.;
  7. call symput ('nvars',_n_);
  8. run;
  9. %macro want;
  10. %do i = 1 %to &nvars;
  11. data _null_;
  12. set vname(firstobs = &i obs = &i);
  13. call symput ('file', strip(fname));
  14. run;
  15. proc import
  16. out = %substr(&file,1,%length(&file)-4)
  17. datafile = "c:\&file"
  18. dbms = csv replace;
  19. guessingrows = 32676;
  20. getnames = YES;
  21. run;
  22. %end;
  23. %mend;
  24. %want

  25. *------------依次带入回归过程步中------------*;

  26. %macro LoopReg;
  27.   %do i = 1 %to &nvars.;
  28.     data _null_;
  29.       set vname(firstobs = &i. obs = &i.);
  30.       call symput("file",strip(fname));
  31.     run;
  32.         %let file=%substr(&file,1,%length(&file)-4);
  33.         proc reg data=&file;
  34.         model y=x;
  35.         run;
  36.         %end;
  37.         %mend;
  38.         %loopreg
复制代码
把宏变量的截短用%let写在data步外了。

点的含义知道了

使用道具

报纸
augustin4 发表于 2014-10-24 23:49:21 |只看作者 |坛友微信交流群
bullstag 发表于 2014-10-24 21:47
&DT generated by symput after the data step
多谢回复!

使用道具

地板
sniperhgy 发表于 2014-10-25 12:50:53 |只看作者 |坛友微信交流群
augustin4 发表于 2014-10-24 23:48
多谢指点!我改成这样就可以了:把宏变量的截短用%let写在data步外了。

点的含义知道了
解决了就好,恭喜

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-26 10:26