我在要导入SAS的文件夹中有几个.csv文件。但是,它们并不总是填充数据,因此当我尝试将空文件导入SAS时,出现错误。我想知道是否有一些方法可以检查外部文件是否为空,如果不是,请将其带入SAS。这是一个我希望自动化的代码,而不必每次都手动检查和记录空白文件。
我在SAS的知识库中遇到了这个宏,但我不确定如何修改它以便导入.csv文件,如果我应该使用它的话:http://support.sas.com/kb/25/072.html
感谢您的帮助。
答案 0 :(得分: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)
您要做的是更改宏在文件为空的情况下执行的操作。在这种情况下,fget
如果能够获取字符串,则返回0到返回码(%let rc = ... fget
),否则它将失败并返回非零代码。
所以,只需修改%if / %else
即可。你只需做一些像
%if &rc=0 %then %do;
%import_csv(&outf.);
%end;
%else %do;
%put File &outf. is empty.;
%end;
假设您有一个用于导入的宏。当然,您可以在那里包含完整的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;