我们在实际工作中处理数据时,往往有好多中间步骤,当测试程序时,要分析整个过程是否正确,但不能光看能不能出结果。因为之前的测试可能产生了数据,而又没有删除这些中间过程的临时表,那么以后测试的时候还保留这原来的数据。修改后的数据步是错误的,那么就不会修改旧的数据集,那么总会给我门一个假象,好像一切都正常。 为了确证这一切,我们需要查看日志LOG,但是这个对眼睛的考验好大啊,特别程序比较庞大时。那么有没有什么好的办法呢?自己动手呗! 写了两个宏,一个清除日志%logclean,虽然本身也没几条语句,但是现在比较懒,能省就省呗,主要把这个加在整个程序的开头,用于清除原来的log。还有一个就是主要的了,把最新的log保存到指定文件,然后用data步读取这个文件,对记录做分析,把错误ERROR与警告WARNING信息收集起来,然后在put到log上,就ok了哦。 测试一下吧,用logcheck()不带参数的话会自动清掉刚刚生成的log,看起来就干净点。参数为1的话会保留log。%macro logclean; DM 'log; "clear";'; run; quit; %mend; %macro logcheck(p); *日志错误信息检查, 注:在不跟参数的时候,将清除日志; 加参数1,怎保留日志; DM 'LOG; log; FILE "y:\temp\check.log" replace;'; *注意修改日志保存的位置,并且同时修改下面data步的infile语句; run; %if &p=1 %then; %else %do; DM 'log; "clear";'; run; quit; %end; %put CHECK at &systime ####################################################################; *data logcheck; data _null_; infile "y:\temp\check.log" end=last; retain line 0; input Key$ @@; line+1; if line=1 then put "=================================================================================="; if Key in ( "ERROR:","ERROR","WARNING:" ) then do; input Desc & $100.; Put key= desc; output; end; else if key="CHECK" then do; input desc & $10.; put "Above was check " desc "---------------------------------------------"; put; end; else input key $; run; %mend; 输出结果举例: 2820 %logcheck(1) CHECK at 10:17 #################################################################### NOTE: Infile "y:\temp\check.log" 是: 文件名=y:\temp\check.log, RECFM=V,LRECL=256 ================================================================================== Key=ERROR: 编号的变量列表中 (s1-d) 数字后缀缺失。 Key=ERROR: 为数组 s 指定的维定义的变量过少。 Key=ERROR 400-185: SUM 语句要求数值表达式。 Key=WARNING: 没有找到列表 s1-s10000 中的所有变量。 Key=WARNING: 数据集 WORK.B 可能不完整。该步停止时,共有 0 个观测和 0 个变量。 Key=WARNING: 数据集 WORK.B 由于该步已停止,而没有被替换。 NOTE: 从 Infile "y:\temp\check.log" 中读取了 265 条记录。 最小记录长度是 0。 最大记录长度是 110。 NOTE: INPUT 语句到达一行的末尾,SAS 已转到新的一行。 NOTE: “DATA 语句”所用时间(总处理时间): 实际时间 0.01 秒 CPU 时间 0.01 秒 |