sas - 如何处理可能不存在的输入文件 (*.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;
例如
%check(/user/lukas/util/test.csv);
推荐阅读
- swift - 如何为 iPhone 和 iPad 纵向和横向设置纵向模式?
- java - 如何使主要返回 char[]
- android - 使用 Bouncy Castle 后,Android 上没有系统 TLS
- javascript - 替代在 JavaScript 中使用回调函数?
- django - 如何在 azure 广告上配置 redirect_uri 以响应两种不同的环境?
- php - 上传多个图像在 PHP MySqli 中删除多个图像上的选定图像
- erlang - 为什么 cyrsasl_scram 机制不允许 base64 GUID?
- dynamics-crm - 使用 Common Data Service (CDS) 设置是或否布尔选项集
- aws-lambda - AWS 上的 Lambdas CloudFormation 错误:“此 Lambda 函数的版本存在。修改函数以创建新版本。”
- java - 这是一本书中的一个问题,我无法理解,但不知何故我想知道我的编码是否正确