我需要找到一个目录中是否有一个带有部分名称(不是全名但文件名为%.txt)的文件。
如何使用通配符(%和_)来搜索文件的可用性?
我们可以在sas中的FILEEXIST函数中使用通配符吗?
答案 0 :(得分:1)
filename search pipe "dir /B c:\temp\bet*.txt";
data _Null_;
infile search;
input;
put _infile_;
run;
答案 1 :(得分:1)
此代码将返回文件名,但它将读取整个文件,因此如果它们很大,可能不是一个好主意:
filename search "c:\temp\bet*.txt";
data _Null_;
attrib filevar length=$1024;
retain filevar "";
infile search filename=filevar;
input;
if filevar ne lag(filevar) then put filevar;
run;
我尝试使用firstobs和obs只读取每个文件中的一行,但没有成功。
如果您对只获得匹配的第一个文件名感到满意,则此代码应该这样做:
filename search "c:\temp\bet*.txt";
data _Null_;
attrib filevar length=$1024;
infile search filename=filevar;
put filevar;
run;
如果您没有获得匹配,则会收到此错误:
ERROR: Physical file does not exist, c:\temp\bet*.txt.
答案 2 :(得分:1)
Stig Eide的方法简单有效。 使用SAS中的目录和文件的另一种方法是使用dopen,dnum,dread和dclose函数。 以下是扫描目录中所有文件的示例:
%let dir= your_path;
data _null_;
rc=filename("filrf","&dir.");
did=dopen("filrf");
nfile=dnum(did);
do j = 1 to nfile;
filename= dread(did,j);
str= 'File n. '||strip(j)||' has name: '||filename;
put str;
end;
rc=dclose(did);
run;
要调查特定文件的存在,您只需要添加某种检查,就像Stig的例子一样。 您也可以使用相同的函数以宏语言处理此问题。
这是一个包含文件名检查的示例:
%macro search(dir=,str=);
%global file_exists;
/* Assigns a fileref to the directory and opens the directory */
%let rc=%sysfunc(filename(filrf,&dir.));
%let did=%sysfunc(dopen(&filrf.));
/* Returns the number of members in the directory */
%let nfile=%sysfunc(dnum(&did.));
/* Loops through entire directory */
%let file_exists=0;
%do j = 1 %to &nfile.;
/* Checks if the j-th member name matches the wildcard */
%put Analyzing file %qsysfunc(dread(&did.,&j.));
%if %index(%qupcase(%qsysfunc(dread(&did.,&j.))),%qupcase(&str.)) > 0
%then %do;
%let file_exists=1;
%put Match found!;
%end;
%end;
%if (&file_exists.=0) %then %put No match found!;
/* Closes the directory */
%let rc=%sysfunc(dclose(&did.));
%mend search;
%search(dir=path_dir, str=wildcard)
%put file_exists= &file_exists.;
%qupcase和%qsysfunc函数的q版只需要处理像%这样的特殊字符。
希望这有帮助! :)