如何从日期之前创建的文件夹中读取文件

时间:2019-06-17 20:01:50

标签: sas pipe filenames

我正在尝试使用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;

2 个答案:

答案 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;