SAS宏Do循环中如何跳过文件不存在的错误并继续执行
解决SAS宏跳过不存在文件并避免重复处理的问题
问题分析
你的宏当前逻辑是遍历start到end之间的工作日(周一至周五),但未考虑法定节假日导致的文件缺失,且报错会中断循环,进而出现重复处理的情况。需要实现提前检查文件存在性,不存在则跳过当前日期,继续执行后续循环。
修改后的宏代码
%macro date_loop(start, end); %let start = %sysfunc(inputn(&start, anydtdte9.)); %let end = %sysfunc(inputn(&end, anydtdte9.)); %let dif = %sysfunc(intck(weekday, &start, &end)); %do i = 0 %to &dif; %let date = %sysfunc(intnx(weekday, &start, &i, b), yymmddn8.); %put 当前处理日期: &date; /* 检查SAS数据集是否存在,若为外部文件可替换为%sysfunc(fileexist("完整路径&date..DATA")) */ %if %sysfunc(exist(&date)) = 0 %then %do; %put 警告: 文件&date..DATA不存在,跳过该日期; %continue; /* 跳过当前循环,进入下一次迭代 */ %end; /* 此处编写你的文件处理代码 */ %put 处理文件: &date..DATA; /* MY CODE TO OPEN FILE WITH THAT DATE */ %end; %mend date_loop; /* 调用示例 */ %date_loop(01jan2015, 02jan2015)
关键修改点
- 文件存在性检查:使用
%sysfunc(exist(&date))判断SAS数据集是否存在;如果是外部文件,替换为%sysfunc(fileexist("/实际文件路径/&date..DATA"))。 - 跳过不存在的日期:当文件不存在时,用
%continue直接跳过当前循环迭代,避免执行后续报错代码,同时不会中断整个循环。 - 避免重复处理:原循环的
i按工作日间隔递增,%continue只会跳过当前日期,不会改变i的递增逻辑,后续日期会正常遍历,不会重复。
执行效果
调用宏后,日志会输出:
当前处理日期: 20150101 警告: 文件20150101.DATA不存在,跳过该日期 当前处理日期: 20150102 处理文件: 20150102.DATA
既不会因文件不存在报错中断,也不会重复处理后续日期。
内容的提问来源于stack exchange,提问作者acbcccdc
相关产品推荐
相关产品推荐

