楼主: shenliang_111
3036 3

[程序分享] 关于批量重命名的四段程序 [推广有奖]

  • 3关注
  • 12粉丝

教授

15%

还不是VIP/贵宾

-

威望
0
论坛币
14 个
通用积分
0.4174
学术水平
20 点
热心指数
26 点
信用等级
12 点
经验
17989 点
帖子
478
精华
0
在线时间
1627 小时
注册时间
2011-2-24
最后登录
2025-8-3

楼主
shenliang_111 发表于 2011-12-10 14:19:40 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币


本人写了四段针对特定逻辑库下批量重命名数据集的程序,希望好朋友们能够做出批评,即哪段程序是最有效率的,并能够再提出新的做法,大家交流下!本人认为,在解决其他同类问题时,这四段程序同样具有
  1. libname ss 'd:\key sas file';
  2. proc datasets lib=work kill;
  3. quit;
  4. proc datasets lib=ss;
  5. copy out=work;
  6. select test:;
  7. quit;
  8. /*select*/
  9. %let lib=work;
  10. %let prefix=a;
  11. proc sql;
  12. create table ss as
  13. select memname,monotonic() as obs from
  14. dictionary.tables
  15. where libname="%upcase(&lib.)";
  16. quit;
  17. proc print noobs;
  18. run;
  19. proc sql;
  20. select 'change '||trim(memname)||"=&prefix."||strip(put(obs,5.))||';'
  21. into :sss separated by ' '
  22. from ss;
  23. quit;
  24. proc datasets lib=&lib. nolist;
  25. &sss.;
  26. quit;
  27. proc delete data=ss;
  28. run;
  29. /*call execute*/
  30. proc datasets lib=work kill;
  31. quit;
  32. proc datasets lib=ss;
  33. copy out=work;
  34. select test:;
  35. quit;
  36. %let lib=work;
  37. %let prefix=a;
  38. proc sql;
  39. create table ss as
  40. select memname,monotonic() as obs from
  41. dictionary.tables
  42. where libname="%upcase(&lib.)";
  43. quit;
  44. proc print noobs;
  45. run;
  46. data _null_;
  47. set ss;
  48. call execute ('proc datasets lib=&lib. nolist;change '||trim(memname)||'=&prefix.'||strip(put(obs,5.))||';');
  49. run;
  50. proc delete data=ss;
  51. run;
  52. /*宏*/
  53. proc datasets lib=work kill;
  54. quit;
  55. proc datasets lib=ss;
  56. copy out=work;
  57. select test:;
  58. quit;
  59. %macro ss(lib,prefix);
  60. proc sql noprint;
  61. select memname
  62. into :sss separated by ' '
  63. from dictionary.tables
  64. where libname="%upcase(&lib.)";
  65. quit;
  66. %let cnt=&sqlobs;
  67. proc datasets lib=&lib. nolist;
  68. %do i=1 %to &cnt.;
  69. %let dsn=%scan(&sss,&i);
  70. change &dsn=&prefix.&i.;
  71. %end;
  72. quit;
  73. %mend;
  74. %ss(work,a)
  75. /*宏2*/
  76. proc datasets lib=work kill;
  77. quit;
  78. proc datasets lib=ss;
  79. copy out=work;
  80. select test:;
  81. quit;
  82. %let lib=work;
  83. %let prefix=a;
  84. proc sql;
  85. create table sss as
  86. select memname from dictionary.tables
  87. where libname="%upcase(&lib.)";
  88. quit;
  89. %macro change();
  90. %let dsid=%sysfunc(open(sss));
  91. %if &dsid %then %do;
  92. %let nobs=%sysfunc(attrn(&dsid,nobs));
  93. %do i=1 %to &nobs.;
  94. %let rc=%sysfunc(fetchobs(&dsid,&i));
  95. %let varnume=%sysfunc(varnum(&dsid,memname));
  96. %let dsn=%sysfunc(getvarc(&dsid,&varnume));
  97. proc datasets lib=&lib. nolist;
  98. change &dsn=&prefix.&i.;
  99. quit;
  100. %end;
  101. %let dsid=%sysfunc(close(&dsid));
  102. %end;
  103. %else %do;
  104. %put cannot open the data set---%sysfunc(sysmsg());
  105. %end;
  106. %mend change;
  107. %change
复制代码

启发性!所以值得讨论!
二维码

扫码加我 拉你入群

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

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

关键词:批量重命名 Dictionary monotonic datasets proc sql 命名 程序

沙发
tianye 在职认证  发表于 2012-5-1 13:02:45
牛人

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

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