楼主: playmore
5732 4

[程序分享] 关于处理SAS的Log文件的宏 [推广有奖]

已卖:1645份资源

学科带头人

2%

还不是VIP/贵宾

-

TA的文库  其他...

R相关

经济学相关

金融工程

威望
1
论坛币
16356 个
通用积分
8.6697
学术水平
372 点
热心指数
394 点
信用等级
341 点
经验
15297 点
帖子
1194
精华
1
在线时间
1332 小时
注册时间
2007-1-11
最后登录
2025-12-1

初级学术勋章 初级热心勋章 中级热心勋章

楼主
playmore 发表于 2013-12-11 09:43:23 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
我经常遇到的问题是想找出成百上千个DATA步和过程步中花费时间最长的步骤
但SAS输出的Log文件可读性不强,也不能从里面方便的找到我要的信息
我写的这个宏是把Log文件里每一个步骤的名称、所在Log文件的行号、所花的实际时间和CPU时间提取出来,方便分析
Log文件大致是下面这个样子:

NOTE: Deleting WORK.SS_TEMP (memtype=DATA).
NOTE: PROCEDURE DELETE used (Total process time):
      real time           0.00 seconds
      cpu time            0.01 seconds

NOTE: The data set WORK.SS_TEMP has 1 observations and 1 variables.
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds

NOTE: There were 1 observations read from the data set WORK.SS_TEMP.
NOTE: The data set WORK.SS_TEMP has 1 observations and 2 variables.
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds

NOTE: PROCEDURE SQL used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds

可以通过把SAS的Log窗口的内容复制到一个文本文件,或是直接利用下面的代码将Log保存到文本文件中
proc printto log='d:\temp\a.log';
run;

具体的宏如下所示:

  1. %macro GetTimeTableForSASLog(InFilePath,TargetTable);

  2. /**********************************************************************/
  3. /* 此宏的作用是读取SAS系统生成的Log文件,并将得到的步骤名称和对应的运 */
  4. /* 行时间保存至结果表格中。其中,InFilePath指定的Log文件,要写全从根 */
  5. /* 目录至最后的文件名称;TargetTable是结果表格。 */
  6. /* */
  7. /* 最终得到的是原始Log文件中包含的步骤名称和对应的运行时间(实际时间 */
  8. /* 和CPU时间),其中N是步骤在原始Log文件中的行号。 */
  9. /* */
  10. /* Created on 2013.12.10 */
  11. /* Modified on 2013.12.11 */
  12. /**********************************************************************/

  13. /* 检查InFilePath的合法性,后缀必须为TXT或LOG */
  14. %if %SYSFUNC(FIND(&InFilePath,%STR(.))) EQ 0 OR (%SYSFUNC(FIND(&InFilePath,%STR(.))) NE 0 AND %UPCASE(%SCAN(&InFilePath,-1,%STR(.))) NE TXT AND %UPCASE(%SCAN(&InFilePath,-1,%STR(.))) NE LOG) %then %do;
  15. %put ERROR: The suffix of InFilePath should be txt or log, please check it again.;
  16. %goto exit;
  17. %end;

  18. /* 检查TargetTable的存在性 */
  19. %if &TargetTable EQ %STR() %then %do;
  20. %put ERROR: The TargetTable should not be blank, please check it again.;
  21. %goto exit;
  22. %end;

  23. /* 开始进行计算 */
  24. /* 第一步:导入LOG文件 */
  25. proc import datafile="&InfilePath" out=&TargetTable replace;
  26. getnames=no;
  27. run;

  28. /* 第二步:处理结果表格 */
  29. data &TargetTable;
  30. set &TargetTable;
  31. N=_N_;
  32. if SUBSTR(UPCASE(VAR1),1,10) EQ 'NOTE: DATA' OR SUBSTR(UPCASE(VAR1),1,15) EQ 'NOTE: PROCEDURE' OR
  33. SUBSTR(UPCASE(VAR1),1,9) EQ 'REAL TIME' OR SUBSTR(UPCASE(VAR1),1,8) EQ 'CPU TIME';
  34. run;

  35. data &TargetTable;
  36. set &TargetTable;
  37. if SUBSTR(UPCASE(VAR1),1,5) EQ 'NOTE:' then do;
  38. Name=SUBSTR(VAR1,7,FIND(UPCASE(VAR1),'USED')-8);
  39. end;
  40. else if SUBSTR(UPCASE(VAR1),1,9) EQ 'REAL TIME' then do;
  41. Real_Time=SUBSTR(VAR1,PRXMATCH('/\d+.\d+/',VAR1));
  42. end;
  43. else if SUBSTR(UPCASE(VAR1),1,9) EQ 'CPU TIME' then do;
  44. CPU_Time=SUBSTR(VAR1,PRXMATCH('/\d+.\d+/',VAR1));
  45. end;
  46. run;

  47. data &TargetTable(keep=Col_N Col_Name Col_Content);
  48. set &TargetTable;
  49. retain Col_N;
  50. length Col_Name $50;
  51. length Col_Content $100;
  52. if Name NE '' then do;
  53. Col_N=N;
  54. Col_Name='Name';
  55. Col_Content=Name;
  56. output;
  57. end;
  58. else if Real_Time NE '' then do;
  59. Col_Name='Real_Time_Temp';
  60. Col_Content=Real_Time;
  61. output;
  62. end;
  63. else if CPU_Time NE '' then do;
  64. Col_Name='CPU_Time_Temp';
  65. Col_Content=CPU_Time;
  66. output;
  67. end;
  68. run;

  69. proc transpose data=&TargetTable out=&TargetTable;
  70. by Col_N;
  71. id Col_Name;
  72. var Col_Content;
  73. run;

  74. /* 第三步:处理结果表格中的时间变量 */
  75. data &TargetTable(keep=N Name Real_Time CPU_Time);
  76. retain N Name Real_Time CPU_Time;
  77. set &TargetTable(rename=(Col_N=N));
  78. format Real_Time TIME10.4;
  79. format CPU_Time TIME10.4;
  80. if FIND(UPCASE(Real_Time_Temp),'SECONDS') NE 0 then Real_Time=HMS(0,0,SCAN(Real_Time_Temp,1,' '));
  81. else if LENGTH(COMPRESS(Real_Time_Temp,'.','d')) EQ 2 then Real_Time=HMS(SCAN(Real_Time_Temp,1,':'),SCAN(Real_Time_Temp,2,':'),SCAN(Real_Time_Temp,3,':'));
  82. else if LENGTH(COMPRESS(Real_Time_Temp,'.','d')) EQ 1 then Real_Time=HMS(0,SCAN(Real_Time_Temp,1,':'),SCAN(Real_Time_Temp,2,':'));

  83. if FIND(UPCASE(CPU_Time_Temp),'SECONDS') NE 0 then CPU_Time=HMS(0,0,SCAN(CPU_Time_Temp,1,' '));
  84. else if LENGTH(COMPRESS(CPU_Time_Temp,'.','d')) EQ 2 then CPU_Time=HMS(SCAN(CPU_Time_Temp,1,':'),SCAN(CPU_Time_Temp,2,':'),SCAN(CPU_Time_Temp,3,':'));
  85. else if LENGTH(COMPRESS(CPU_Time_Temp,'.','d')) EQ 1 then CPU_Time=HMS(0,SCAN(CPU_Time_Temp,1,':'),SCAN(CPU_Time_Temp,2,':'));
  86. run;

  87. %exit:
  88. %mend;
复制代码

另外,我这里的方法属于土法练钢,如果有其他好的办法,欢迎跟贴。
二维码

扫码加我 拉你入群

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

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

关键词:sas的 Log observations observation Procedure

已有 4 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
dxystata + 100 + 1 + 1 精彩帖子
webgu + 100 + 100 + 3 + 3 + 3 精彩帖子
Imasasor + 100 + 100 + 4 + 4 + 4 分析的有道理
heperwong + 1 + 1 + 1 鼓励积极发帖讨论

总评分: 经验 + 300  论坛币 + 200  学术水平 + 9  热心指数 + 9  信用等级 + 8   查看全部评分

本帖被以下文库推荐

playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

沙发
Imasasor 发表于 2013-12-11 13:29:30
绝世好贴,先收藏再看,欢迎分享
欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

藤椅
with_luck 发表于 2013-12-22 17:17:42
mark~

板凳
oneoneagain 发表于 2014-5-27 22:41:59
先顶后看!

报纸
sabin 发表于 2016-9-14 11:01:01
绝世好贴啊!!!!!!!

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

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