首页 文章

SAS - 向后阅读文件?

提问于
浏览
2

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

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

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

2 回答

  • 4

    如果你的意思是解析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!
    */
    
  • 0

    我可能会设置一个文件名管道语句来使用像 tail -rtac 这样的操作系统命令以与SAS相反的顺序显示文件 . 这样SAS可以正常读取文件,您不必担心文件有多长 .

相关问题