上下文:
我正在读(使用DATA STEP infile
)许多文件夹(大约80个),这些文件夹基本上包含三类*.txt
文件(4个ASCII文件),进行处理,然后有时合并(实际上合并)使用DATA STEP set
)将这些数据集分为两个文件夹(每个文件夹),然后覆盖所有文件夹。
有时会发生一种或两种类别丢失的情况,SAS
会抛出ERROR message ("ERROR: Physical file does not exist")
,但仍会继续,看来一切仍然正常。 SAS
似乎会生成一个空数据集(没有obs)并使用这些数据集。
问题:
无论如何,我想摆脱那些ERRORS
并使用%IF
语句检查文件是否存在-可以正常工作-否则跳过数据步骤。但是,当我尝试合并那些不存在的数据集时,我得到了ERRORS
的新来源,同时我也根据变量(不存在-ERROR
)对这些数据集进行了排序。我正在考虑检查数据集是否为空,并取决于此合并等。但是我不确定这是否是最好的主意。有什么建议吗?另外,SAS
已经花费大量时间来处理所有数据。从耗时的POV来看,这是一个好主意吗(检查文件是否存在等)?
我的解决方案:
%IF
语句和%fileexist
捕获那些不存在的文件DATA STEP set
这取决于ASCII文件包含多少数据,但是整个过程已经花费了1.5分钟,因此我将不得不添加更多数据。 DATA STEP infile
慢吗?
答案 0 :(得分:0)
您可以使用%sysfunc(fileexist())宏函数。 请尝试以下代码。传递FILE参数时,请确保它包含完整路径。
%macro check(file);
%if %sysfunc(fileexist(&file)) %then %do;
%put File &file exists.;
%* YOUR CODE HERE *;
%end;
%else
%put The external file &file does not exist.;
%mend;
例如
%check(/user/lukas/util/test.csv);
答案 1 :(得分:0)
您最有可能希望首先获取文件列表,然后再处理它们。例如,您可以使用操作系统命令来获取文件列表。 (或搜索使用SAS的dread()
函数的代码以获取列表)。
data files ;
infile "ls &path/*.txt" pipe truncover ;
input filename $256.;
run;
然后,您可以使用文件列表来驱动以后的步骤。因此,也许可以通过在INFILE语句上使用FILEVAR =选项。
data want;
set files ;
fname=filename;
infile txt filevar=fname end=eof dsd truncover ;
do while (not eof);
input .... ;
output;
end;
run;