如何从某个日期之前创建的文件夹中读取文件
how to read files from a folder that were created before a date
我正在尝试使用 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 0.;
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;
目前您正在使用 dir
命令读取文件名。现有的 /b
修饰符表示只打印文件名,没有其他内容。您想要将其更改为同时读取文件名和文件的创建日期。为了做到这一点,它变得有点混乱。您需要更改该管道命令:
filename DIRLIST pipe 'dir "C:\_today\file*.csv" /b ';
...为此...:[=22=]
filename DIRLIST pipe 'dir "C:\_today\file*.csv" /tc ';
输出会变成这样:
file1.csv
file2.csv
...
...像这样...:[=22=]
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
命令的可用开关列表。您可能会发现它的开关组合略有不同,比我上面列出的更适合您的任务。
您可以使用 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;
我正在尝试使用 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 0.;
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;
目前您正在使用 dir
命令读取文件名。现有的 /b
修饰符表示只打印文件名,没有其他内容。您想要将其更改为同时读取文件名和文件的创建日期。为了做到这一点,它变得有点混乱。您需要更改该管道命令:
filename DIRLIST pipe 'dir "C:\_today\file*.csv" /b ';
...为此...:[=22=]
filename DIRLIST pipe 'dir "C:\_today\file*.csv" /tc ';
输出会变成这样:
file1.csv
file2.csv
...
...像这样...:[=22=]
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
命令的可用开关列表。您可能会发现它的开关组合略有不同,比我上面列出的更适合您的任务。
您可以使用 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;