管道如何使用SAS读取和分离时间变量?

管道如何使用SAS读取和分离时间变量?,sas,pipe,Sas,Pipe,我有一个文件夹,里面有一些表格。一旦我打开它,它就会显示表名、大小、修改时间和类型 table name size time modified sales1.sas7bdat 490k 01/28/2021 9:32:50 am sales2.sas7bdat 85k 11/12/2020 4:28:23 pm sales3.sas7bdat 307k

我有一个文件夹,里面有一些表格。一旦我打开它,它就会显示表名、大小、修改时间和类型

table name            size     time modified                
sales1.sas7bdat       490k     01/28/2021 9:32:50 am       
sales2.sas7bdat        85k     11/12/2020 4:28:23 pm       
sales3.sas7bdat       307k     02/17/2021 1:55:09 pm       
我正在尝试使用SAS读取所有信息,包括:表名、大小、修改时间和类型。所以我先试了一下管道:

data new;
infile "ls -l /abc/sales/" pipe truncover ;
 input all $500.;
run;
但我发现变量“修改的时间”被弄乱了,例如,对于“2021年”,2021年消失了,而对于“2020年”,时间消失了。案文如下:

 sales1.sas7bdat 4897656 Jan 28 9:32    
 sales2.sas7bdat  856589 Nov 12 2020      
 sales3.sas7bdat 3036878 Feb 17 1:55  
因此,我想知道如何将“修改的时间”分为两个变量日期和时间(如果很难获得hh:mm:ss,则hh:mm可以):


谢谢

ls生成的datetime的默认输出将包括日期在今天6个月内的时间和日期不在今天6个月内的年份。但它看起来不像你展示的那样。相反,它应该是这样的:

-rw-rw-r-- 1 user1 group1 4897656 Jan 28 9:32 sales1.sas7bdat 
-rw-rw-r-- 1 user2 group2  856589 Nov 12 2020 sales2.sas7bdat   
-rw-rw-r-- 1 user3 group3 3036878 Feb 17 1:55 sales3.sas7bdat 
-rw-rw-r-- 1 user1 group1 4897656 2021-01-28 09:32:00.000000000 -0400 sales1.sas7bdat 
-rw-rw-r-- 1 user2 group2  856589 2020-11-12 01:02:03.000000000 -0400 sales2.sas7bdat   
-rw-rw-r-- 1 user3 group3 3036878 2021-02-17 01:55:04.000000000 -0400 sales3.sas7bdat 
但是在更现代的Unix版本上,您可以使用--full-time选项,让它为日期时间输出一致的格式。所以你会得到这样的结果:

-rw-rw-r-- 1 user1 group1 4897656 Jan 28 9:32 sales1.sas7bdat 
-rw-rw-r-- 1 user2 group2  856589 Nov 12 2020 sales2.sas7bdat   
-rw-rw-r-- 1 user3 group3 3036878 Feb 17 1:55 sales3.sas7bdat 
-rw-rw-r-- 1 user1 group1 4897656 2021-01-28 09:32:00.000000000 -0400 sales1.sas7bdat 
-rw-rw-r-- 1 user2 group2  856589 2020-11-12 01:02:03.000000000 -0400 sales2.sas7bdat   
-rw-rw-r-- 1 user3 group3 3036878 2021-02-17 01:55:04.000000000 -0400 sales3.sas7bdat 
现在,使用SAS输入语句将很容易阅读

data files ;
  infile "ls -l --full-time /abc/sales/" pipe truncover ;
  length mode $10 links 8 user group $20 size 8 date 8 time 8 offset 8 name $256 ;
  informat date yymmdd. time time. ;
  input mode -- name ;
  offset = sign(offset)*input(put(abs(offset),z4.)||'00',hhmmss.);
  format date yymmdd10. time time8. offset time6.;
run;

proc print;
  var name size date time offset ;
run;
结果:

Obs         name            size           date        time    offset

 1     sales1.sas7bdat    4897656    2021-01-28     9:32:00    -4:00
 2     sales2.sas7bdat     856589    2020-11-12     1:02:03    -4:00
 3     sales3.sas7bdat    3036878    2021-02-17     1:55:04    -4:00
您可以将任何想要的日期类型格式附加到日期变量,但我强烈建议不要使用您请求的MDY订单或世界其他地区更喜欢的DMY订单,因为任何一种选择都会让一半的读者感到困惑

如果您确实需要处理这三个字段,其中一个字段是年份或时间,那么这里有一些逻辑

data files ;
  infile "ls -l /abc/sales/" pipe truncover ;
  length name $256 size date time 8 user group $20 mode $10 links 8 mon $3 day $2 yr $5;
  input mode links user group size mon day yr name ;
  time=input(yr,??time5.);
  if missing(time) then do;
    time='23:59:59't ;
    date=input(cats(day,mon,yr),date9.);
  end;
  else do;
    date=input(cats(day,mon,year(today())),??date9.);
    if date > today() or missing(date) then 
      date=input(cats(day,mon,year(today())-1),date9.)
    ;
  end;
  drop mon day yr;
  format date yymmdd10. time time8. ;
run;

您可以使用操作系统不可知SAS函数
DOPEN
DREAD
获取文件夹中的文件名,并
FOPEN
FINFO
检索文件属性。“如何:列出文件夹中的所有文件”这篇文章详细介绍了它。

这里有答案。但它似乎更倾向于使用Unix命令修改日期的显示方式,而不是使用SAS解释LS生成的内容。这种输出不是LS通常生成信息的方式。您的SAS会话运行在什么操作系统上?系统是unixlooks,就像我们的unix已经过时一样,填充“ls-l--full-time/abc/sales/”管道truncover;不起作用。但是谢谢你的解决方案!检查自动宏变量SYSSCP和/或SYSSCPL的操作系统检查值<代码>%put&=sysscp&=sysscpl谢谢Richard!