如何处理可能不存在的输入文件(* .txt)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何处理可能不存在的输入文件(* .txt)相关的知识,希望对你有一定的参考价值。
语境:
我正在阅读(使用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
捕获那些不存在的文件 - 生成一个数据集(自动有1个观察值),它只包含我正在排序的变量
- 删除观察
- 它遵循
DATA STEP set
- 删除空数据集
这取决于ASCII文件包含多少数据,但整个过程需要1.5分钟,我将不得不添加更多数据。 DATA STEP infile
是慢吗?
您可以使用%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;
EG
%check(/user/lukas/util/test.csv);
您很可能希望首先获取文件列表然后处理它们。例如,您可以使用操作系统命令来获取文件列表。 (或搜索使用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;
以上是关于如何处理可能不存在的输入文件(* .txt)的主要内容,如果未能解决你的问题,请参考以下文章