2014-10-31 60 views
2

当输入文件不正确时,我的团队中的成员正在使用SAS,它们的代码返回“错误”,“无效”,“合并语句”,“未初始化”和“警告”无论原因。查看SAS代码的输出日志

运行代码后,我会使用CTRL + F常规检查这些关键字的输出日志,并且必须相应地修改我的输入文件。

正如你所想象的,使用CTRL + F非常费力。

我希望代码能够在输出结束时自动打印输出结果中是否有上述任何一个语句。

我该怎么做?我在哪里可以找到关于如何编程的信息?

我使用的是SAS 9.1

+1

我强烈建议升级到更新的版本,或要求您的网站升级。 9.1大约十岁,甚至比9.2还缺少一些显着特征,更不用说9.3或9.4。 – Joe 2014-10-31 16:52:21

回答

3

如果升级到SAS 9.4和为您的编程环境使用Enterprise Guide t,它内置了一个自动日志解析器,标记错误/警告,将它们分组在底部,让您单击以查找代码或记录它们出现的位置,并为您提供计数。其次,如果你批量运行你的代码(右键单击.sas文件 - >批量提交,或通过.bat文件或类似文件运行),那么日志将包含指向最后错误的指针,如“错误在页面45,46,48,55,56上打印”。不是警告或注释,只是错误。

最后,很多人编写并发布了在线日志解析器/分析器/阅读器。其中一些人执行与上述要求类似的任务。 SasCommunity有一个很好的名单,或使用您所选择的搜索引擎。

4

考虑您的日志重定向到使用PROC PRINTTO文件。从那里运行这段代码找到你所提到的字符串的任何事件:

filename logfl "<insert log filename here>" lrecl=32767; 
/* Lrecl set high to ensure long lines are captured */ 

data _NULL_; 
    infile logfl; 
    input; 
    if index (_infile_,'ERROR:') then put _infile_; 
    else if index(_infile_,'WARNING') then put _infile_; 
    else if index(_infile_,'uninitialized') then put _infile_; 
    else if index(_infile_,'Merge statements') then put _infile_; 
run; 

务必确认您要查找的字符串的资本,或者干脆用UPCASE()带回任何资本化,例如

if index(upcase(_infile_),'UNINITI') then put _infile_; 

这将匹配UninitiUNINiTi

的代码将简单地打印回感兴趣的线路在日志中发现的顺序。你可以进一步改善代码:

  • 把字符串到一个单独的数据集或平面文件(如果你发现更多你想寻找的东西,并希望使代码更易于维护)
  • 打印在string中找到的行号(输出_N__infile_一起 - 测试这个第一,我不知道是否会_N_究竟映射的行号)
+0

这看起来很棒。非常感谢你。我们将执行它,并在我们运行时接受。 – Benjamin 2014-10-31 13:23:33

+0

没问题,我必须承认我没有在SAS中编程约6个月,所以如果有任何问题,只要问,我希望能够提供帮助。 – mjsqu 2014-10-31 13:25:35

+1

您可以使用'find'而不是'index',它具有修饰符'i',以使其不区分大小写。 – Joe 2014-10-31 16:44:56