如何处理可能不存在的输入文件(* .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)的主要内容,如果未能解决你的问题,请参考以下文章

如何处理数据不均衡问题(分类问题)

如何处理ECHO 处于关闭状态

不从服务器上存在的 .txt 文件中读取文本[重复]

当“try .. except IOError”未捕获时如何处理 FileNotFoundError?

linux 硬盘满了如何处理

如何处理已有标题的数据?