首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管道如何使用SAS读取和分离时间变量?

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

Stack Overflow用户
提问于 2021-04-02 21:58:35
回答 2查看 42关注 0票数 0

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

代码语言:javascript
复制
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的类型。因此,我首先尝试了管道:

代码语言:javascript
复制
data new;
infile "ls -l /abc/sales/" pipe truncover ;
 input all $500.;
run;

但是我发现变量“时间修改”被搞乱了,比如“2021年”,2021年消失了,“2020”年时间消失了。它是这样理解的:

代码语言:javascript
复制
 sales1.sas7bdat 4897656 Jan 28 9:32    
 sales2.sas7bdat  856589 Nov 12 2020      
 sales3.sas7bdat 3036878 Feb 17 1:55  

所以我想知道如何将'time modified‘分成两个变量date和time(如果很难得到hh:mm:ss,hh:mm就可以了):

代码语言:javascript
复制
 table name            size      date          time       
 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

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2021-04-02 23:34:51

ls生成的datetime的默认输出将包括日期在今天6个月内的一天中的时间以及日期不在今天6个月内的年份。但它看起来并不像您显示的那样。相反,它应该看起来像这样:

代码语言:javascript
复制
-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 

但是在更新版本的Unix上,您可以使用--full-time选项,让它输出一致的日期时间格式。所以你会得到这样的结果:

代码语言:javascript
复制
-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 input语句可以很容易地读取这些内容。

代码语言:javascript
复制
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;

结果:

代码语言:javascript
复制
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

您可以将任何日期类型格式附加到date变量,但我强烈建议不要使用您请求的MDY顺序或世界上其他地方喜欢的DMY顺序,因为这两种选择都会使一半的读者感到困惑。

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

代码语言:javascript
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2021-04-02 23:38:42

您可以使用与操作系统无关的SAS函数DOPENDREAD来获取文件夹中的文件名,使用FOPENFINFO来检索文件属性。https://communities.sas.com/t5/SAS-Programming/bd-p/programming的固定帖子“如何:列出文件夹中的所有文件”详细介绍了这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66920436

复制
相关文章

相似问题

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