管道如何使用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!