如何处理可能不存在的输入文件(* .txt)

时间:2019-02-12 10:13:45

标签: sas

上下文:

我正在读(使用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慢吗?

2 个答案:

答案 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;