首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取linux上文件修改日期的SAS宏函数

问获取linux上文件修改日期的SAS宏函数
EN

Stack Overflow用户
提问于 2015-05-20 16:11:06
回答 1查看 1.5K关注 0票数 1

使用宏函数将文件的修改日期作为SAS日期返回,该日期将在Linux (SAS9.3)上运行。我希望避免使用OS命令(例如,将LS命令的结果管道化),因为代码需要在使用NOXCMD的环境中工作。下面是使用finfo()的第一个草稿(没有错误处理代码等)。

对finfo()返回的日期格式感到失望,例如“星期五4月10日14:54:10 2015”。更让我失望的是,我无法输入()这个字符串,而没有下面丑陋的解析。我过去通常避免使用ANYDTDTE格式,因为我担心它会做太多的猜测,并且不会抛出错误。但是,编写一个自定义的日期-时间信息格式来处理这个字符串,感觉有点过分了。

希望您能想到将日期字符串转换为SAS日期的更好方法,获得文件修改日期的更好方法,以及下面的任何缺陷。

代码语言:javascript
复制
%macro GetModDate(file);
  %*Get the modified date of a linux file, as SAS date;
  %local rc fref fid ModDate;

  %let rc=%sysfunc(filename(fref,&file));
  %let fid=%sysfunc(fopen(&fref));

  %let ModDate=%sysfunc(finfo(&fid,Last Modified));

  %*Linux Last Modified returns format like: Fri Apr 10 14:54:10 2015;
  %let ModDate=%sysfunc(inputn(%scan(&moddate,2,%str( )) %scan(&moddate,3,%str( )) %scan(&moddate,5,%str( ))
                              ,anydtdte11
                               ));
  %let fid=%sysfunc(fclose(&fid));
  %let rc=%sysfunc(filename(fref));

  &ModDate
%mend GetModDate;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-20 17:16:46

至少在Windows上不会发生这种情况。我有一个很好的SAS约会时间。

添加一些调试:

代码语言:javascript
复制
%macro GetModDate(file);
  %*Get the modified date of a linux file, as SAS date;
  %local rc fref fid ModDate;

  %let rc=%sysfunc(filename(fref,&file));
  %put &=rc;
  %let fid=%sysfunc(fopen(&fref));
  %put &=fid;
  %let ModDate=%sysfunc(finfo(&fid,Last Modified));
  %put &=ModDate;
  %*Linux Last Modified returns format like: Fri Apr 10 14:54:10 2015;
  %let ModDate=%sysfunc(inputn(%scan(&moddate,2,%str( )) %scan(&moddate,3,%str( )) %scan(&moddate,5,%str( ))
                              ,anydtdte11
                               ));
  %let fid=%sysfunc(fclose(&fid));
  %let rc=%sysfunc(filename(fref));

  &ModDate
%mend GetModDate;

%getModDate(c:\temp\test.html)

返回

代码语言:javascript
复制
RC=0
FID=2
MODDATE=19Mar2015:10:19:09

不过,我不确定是否有更好的方法可以让Linux按照您想要的方式工作,不过,如果您已经开始手工解析ANYDTDTE,那么您可以做一些改进来避免ANYDTDTE。

例如:

代码语言:javascript
复制
%let ModDate=
    %sysfunc(inputn(
        %scan(&moddate,3,%str( ))%scan(&moddate,2,%str( ))%scan(&moddate,5,%str( )),
        date9.)
     );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30355046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档