楼主: priss111
1390 0

[问答] 请问如何将下面2个宏嵌套成1个宏?谢谢。 [推广有奖]

  • 0关注
  • 5粉丝

已卖:9份资源

副教授

16%

还不是VIP/贵宾

-

威望
0
论坛币
153 个
通用积分
47.5396
学术水平
11 点
热心指数
14 点
信用等级
10 点
经验
14935 点
帖子
472
精华
0
在线时间
808 小时
注册时间
2008-3-30
最后登录
2025-3-17

楼主
priss111 发表于 2017-6-16 16:26:22 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
请问如何将下面2个宏嵌套成1个宏?
谢谢.

  1. /*1. %directory;*/

  2. %macro directory(dir=);
  3.         /*%global nobs name;  */                      /*定义nobs 与 name为全局宏变量;*/
  4.         %let rs=%sysfunc(filename(filref,&dir));  /*为外部文件(文件夹)指定一个fileref,指定位置&dir;*/
  5.         %let did=%sysfunc(dopen(&filref));        /*打开文件夹,%sysfunc(dopen(fileref));*/
  6.         %let nobs=%sysfunc(dnum(&did));           /*确定(return)文件夹中文件(txt/excel/csv...)的个数,%sysfunc(dnum(directory-id));*/

  7.         %do i=1 %to &nobs.;         
  8.             %let name=%qscan(%qsysfunc(dread(&did,&i)),1,.);  /*%qscan()查找dread返回的文件名,从位置1开始查,遇见分隔符 . 则忽略;*/
  9.                                                       /*宏函数中的分隔符不用单引号或双引号括起来,但scan函数中的分隔符要加单引号;*/
  10.            /* %let txt=%qscan(%qsysfunc(dread(&did,&i)),-1,.);*/   /*-1是从反向第1个位置查, 这句可以不要;*/

  11.          data WORK.&name.    ;
  12.                %let _EFIERR_ = 0; /* set the ERROR detection macro variable */
  13.                        infile "&dir.\&name..txt" delimiter='09'x MISSOVER DSD dlm="" lrecl=32767 firstobs=1 ;
  14.          
  15.           informat var1 best1.;
  16.                   informat var2 best2.;

  17.           format var1 best1.;
  18.                   format var2 best2.;

  19.                   input  var1
  20.                                  var2
  21.        ;
  22.        if _ERROR_ then call symputx('_EFIERR_',1);  /* set ERROR detection macro variable */
  23.     run;

  24.         %end;
  25.         %let rc=%sysfunc(dclose(&did));   /*dclose是关闭文件夹;*/
  26. %mend;
  27. %directory(dir=d:\all_txt);



  28. /*2. %freq;*/

  29.         /***(1)因原始txt数据文件有两列,依次是阳性频数列与总频数列,
  30.                         需要根据proc freq进行chi-square test的数据格式要求生成频数列;*/

  31. data zgroup;
  32.         do group = 1 to 2;
  33.                 do r = 1 to 2;
  34.                         output;
  35.                 end;
  36.         end;
  37. run;
  38. %macro freq(dir=);
  39.         %let rs=%sysfunc(filename(filref,&dir));  /*为外部文件(文件夹)指定一个fileref,指定位置&dir;*/
  40.         %let did=%sysfunc(dopen(&filref));        /*打开文件夹,%sysfunc(dopen(fileref));*/
  41.         %let nobs=%sysfunc(dnum(&did));           /*确定(return)文件夹中文件(txt/excel/csv...)的个数,%sysfunc(dnum(directory-id));*/

  42.         %do i=1 %to &nobs.;         
  43.             %let name=%qscan(%qsysfunc(dread(&did,&i)),1,.);  /*%qscan()查找dread返回的文件名,从位置1开始查,遇见分隔符 . 则忽略;*/
  44.                                                              /*宏函数中的分隔符不用单引号或双引号括起来,但scan函数中的分隔符要加单引号;*/
  45.                           data work.&name.(keep=freq);       
  46.                                 set work.&name.;
  47.                                         var1_=var2-var1;

  48.                                         freq=var1; output;
  49.                                         freq=var1_; output;
  50.                         run;                           
  51.         data work.&name.;                                                                         /***将(1)与group数据集横向合并生成所需数据格式;*/
  52.                 merge work.zgroup work.&name.;
  53.         run;

  54.         %end;

  55.         proc delete data=work.zgroup;
  56.         run;
  57.         %let rc=%sysfunc(dclose(&did));   /*dclose是关闭文件夹;*/

  58. %mend;
  59. %freq(dir=c:\Users\lenovo\AppData\Local\Temp\SAS Temporary Files\_TD8504_);  
  60. /* %freq是临时数据集work的地址*/
复制代码


二维码

扫码加我 拉你入群

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

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

关键词:directory detection delimiter TEMPORARY Director

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-30 09:57