我需要SAS来读取许多大型日志文件,这些日志文件设置为最近的活动位于底部。我所需要的只是特定活动发生的最近时间,我想知道SAS是否可以跳过解析文件的(长)开头部分。
我在线查看了如何向后读取数据集,但这需要SAS首先将.log文件中的所有内容解析为数据集。是否有可能从最末端开始直接读取文件,以便在找到特定类型的最新活动后立即停止数据步骤?
我也读了infile和firstobs选项,但我不知道这些日志文件在被解析之前有多长,对吧?对我来说听起来很像22。我所描述的是可行的吗?
答案 0 :(得分:4)
我可能会设置一个文件名管道语句来使用像tail -r
或tac
这样的操作系统命令以与SAS相反的顺序显示文件。这样SAS可以正常读取文件,您不必担心文件有多长。
答案 1 :(得分:0)
如果你的意思是解析sas日志文件,我不确定向后阅读日志文件是否值得在实践中遇到麻烦。例如,以下代码在我的PC上执行不到十分之一秒,它正在编写和读取10,000行日志文件。您的日志文件有多大,有多少?同样如下所示,您不必在每行上“解析”所有内容。您可以有选择地阅读该行的某些部分,如果它不是您想要的,那么您可以转到下一行。
%let pwd = %sysfunc(pathname(WORK));
%put pwd=&pwd;
x cd &pwd;
/* test file. more than 10,000 line log file */
data _null_;
file "test.log";
do i = 1 to 1e4;
r = ranuni(0);
put r binary64.;
if r < 0.001 then put "NOTE: not me!";
end;
put "NOTE: find me!";
do until (r<0.1);
r = ranuni(0);
put r binary64.;
end;
stop;
run;
/* find the last line that starts with
NOTE: and get the rest of the line. */
data _null_;
length msg $80;
retain msg;
infile "test.log" lrecl=80 eof=eof truncover;
input head $char5. @;
if head = "NOTE:" then input @6 msg $char80.;
else input;
return;
eof:
put "last note was on line: " _n_ ;
put "and msg was: " msg $80.;
run;
/* on log
last note was on line: 10013
and msg was: find me!
*/