我有一个文件夹,里面有一些表格。一旦我打开它,它就会显示表名、大小、修改时间和类型。
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 所以我想知道如何将'time modified‘分成两个变量date和time(如果很难得到hh:mm:ss,hh:mm就可以了):
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谢谢!
发布于 2021-04-02 23:34:51
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 但是在更新版本的Unix上,您可以使用--full-time选项,让它输出一致的日期时间格式。所以你会得到这样的结果:
-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语句可以很容易地读取这些内容。
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您可以将任何日期类型格式附加到date变量,但我强烈建议不要使用您请求的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;发布于 2021-04-02 23:38:42
您可以使用与操作系统无关的SAS函数DOPEN、DREAD来获取文件夹中的文件名,使用FOPEN、FINFO来检索文件属性。https://communities.sas.com/t5/SAS-Programming/bd-p/programming的固定帖子“如何:列出文件夹中的所有文件”详细介绍了这一点。
https://stackoverflow.com/questions/66920436
复制相似问题