SAS - 检查外部文件(.csv)是否为空; 如果没有,请导入SAS

use*_*153 4 sas sas-macro

我在一个文件夹中有几个.csv文件,我想导入SAS.但是,它们并不总是填充数据,因此当我尝试将空文件导入SAS时,出现错误.我想知道是否有一些方法可以检查外部文件是否为空,如果不是,请将其带入SAS.这是一个我想要自动化的代码,而不必每次都手动检查和计算空白文件.

我在SAS的知识库中遇到了这个宏,但我不确定如何修改它以便导入.csv文件,如果我应该使用它:http://support.sas.com/kb/25/ 072.html

我感谢您的帮助.

Joe*_*Joe 6

这是链接中的宏:

%macro test(outf);
 %let filrf=myfile;
 %if %sysfunc(fileexist(&outf)) %then %do;
 %let rc=%sysfunc(filename(filrf,&outf));
 %let fid=%sysfunc(fopen(&filrf));
  %if &fid > 0 %then %do;
   %let rc=%sysfunc(fread(&fid));
   %let rc=%sysfunc(fget(&fid,mystring));
    %if &rc = 0 %then %put &mystring;
    %else %put file is empty;
   %let rc=%sysfunc(fclose(&fid));
  %end;
%let rc=%sysfunc(filename(filrf));
%end;
%else %put file does not exist;
%mend test;

%test(c:\test.txt)
Run Code Online (Sandbox Code Playgroud)

你想要做的是改变宏在文件为空的情况下的作用.在这种情况下,如果能够获取字符串,fget它将返回0返回代码(%let rc = ... fget),否则它将失败并返回非零代码.

所以,只需修改%if / %else.你可以做类似的事情而不是放东西

%if &rc=0 %then %do;
  %import_csv(&outf.);
%end;
%else %do;
  %put File &outf. is empty.;
%end;
Run Code Online (Sandbox Code Playgroud)

假设您有一个宏来执行导入.当然,您可以在那里包含完整的PROC IMPORT代码.

事实上,这确实是对导入宏进行合理的错误检查包装器.

%macro import_csv(outf=,outds=);
 %let filrf=myfile;
 %if %sysfunc(fileexist(&outf)) %then %do;
 %let rc=%sysfunc(filename(filrf,&outf));
 %let fid=%sysfunc(fopen(&filrf));
  %if &fid > 0 %then %do;
   %let rc=%sysfunc(fread(&fid));
   %let rc=%sysfunc(fget(&fid,mystring));
   %let rc_close=%sysfunc(fclose(&fid));
    %if &rc = 0 %then %do;
       proc import file="&outf." out="&outds."
                   dbms=csv replace;
       run;
    %end;
    %else %put File &outf. is empty and not imported.;
  %end;
 %let rc=%sysfunc(filename(filrf));
 %end;
 %else %put file does not exist;
%mend test;
Run Code Online (Sandbox Code Playgroud)