SAS - 向后阅读文件?

时间:2009-11-06 15:59:36

标签: file-io sas

我需要SAS来读取许多大型日志文件,这些日志文件设置为最近的活动位于底部。我所需要的只是特定活动发生的最近时间,我想知道SAS是否可以跳过解析文件的(长)开头部分。

我在线查看了如何向后读取数据集,但这需要SAS首先将.log文件中的所有内容解析为数据集。是否有可能从最末端开始直接读取文件,以便在找到特定类型的最新活动后立即停止数据步骤?

我也读了infile和firstobs选项,但我不知道这些日志文件在被解析之前有多长,对吧?对我来说听起来很像22。我所描述的是可行的吗?

2 个答案:

答案 0 :(得分:4)

我可能会设置一个文件名管道语句来使用像tail -rtac这样的操作系统命令以与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!
*/