在SAS中搜索具有部分文件名的文件的存在

时间:2015-04-30 08:09:51

标签: sas

我需要找到一个目录中是否有一个带有部分名称(不是全名但文件名为%.txt)的文件。

如何使用通配符(%和_)来搜索文件的可用性?

我们可以在sas中的FILEEXIST函数中使用通配符吗?

3 个答案:

答案 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版只需要处理像%这样的特殊字符。

希望这有帮助! :)