我正在尝试使用SAS从目录中读取多个文件,这些文件是在日期之前创建的。
我已使用此代码帮助我读取所有文件。它运作完美。现在,我发现只需要在特定日期之前创建的某些文件。我认为可以通过FILENAME PIPE Dir选项或INFILE语句选项来完成,但是我找不到答案。
代码源:
http://support.sas.com/kb/41/880.html
filename DIRLIST pipe 'dir "C:\_today\file*.csv" /b ';
data dirlist ;
infile dirlist lrecl=200 truncover;
input file_name $100.;
run;
data _null_;
set dirlist end=end;
count+1;
call symputx('read'||put(count,4.-l),cats('c:\_today\',file_name));
call symputx('dset'||put(count,4.-l),scan(file_name,1,'.'));
if end then call symputx('max',count);
run;
options mprint symbolgen;
%macro readin;
%do i=1 %to &max;
data &&dset&i;
infile "&&read&i" lrecl=1000 truncover dsd;
input var1 $ var2 $ var3 $;
run;
%end;
%mend readin;
%readin;
答案 0 :(得分:1)
当前,您正在使用dir
命令仅读取文件名。现有的/b
修饰符表示仅打印文件名,而不打印其他任何文件。您想要更改它以同时读取文件名和文件的创建日期。为了做到这一点,它有点混乱。您需要从以下位置更改该管道命令:
filename DIRLIST pipe 'dir "C:\_today\file*.csv" /b ';
...对此...:
filename DIRLIST pipe 'dir "C:\_today\file*.csv" /tc ';
输出将发生如下变化:
file1.csv
file2.csv
...
...到这样的东西...:
Volume in drive C has no label.
Volume Serial Number is 90ED-A122
Directory of C:\_today
01/13/2017 09:14 AM 1,991 file1.csv
01/11/2017 11:43 AM 169 file2.csv
...
...
...
01/11/2017 11:43 AM 169 file99.csv
99 File(s) 6,449 bytes
0 Dir(s) 57,999,806,464 bytes free
因此,您将需要修改创建dirlist
的数据步骤,以清理新的dir
语句返回的结果。您将需要忽略页眉和页脚,并读取日期和时间等。以适当的SAS格式获取日期和时间后,就可以使用SAS where
子句来保留行感兴趣。我将保留此练习作为您的练习。如果您遇到问题,可以随时提出一个新问题。
如果需要有关dir
命令的更多信息,可以打开命令提示符(“开始”菜单->“运行”->“ cmd”),然后键入dir /?
以查看列表dir
命令可用开关的数量。您可能会发现与之稍有不同的开关组合,它比我上面列出的更适合您的任务。
答案 1 :(得分:1)
您可以使用powershell
来利用操作系统的功能。
filename get_them pipe
" powershell -command
""
dir c:\temp
| where {$_.LastWriteTime -gt '3/19/2019'}
| select -property name
| ft -hidetableheader
""
";
data _null_;
infile get_them;
input;
putlog _infile_;
run;