SAS文件数量校验:求简便实现方案及现有代码逻辑修正
SAS目录文件输出正确性校验方案及代码修正
需求说明
- 需校验目录内文件输出是否完整,数据集
DPS_file_count已读取目录下所有文件名 - 规则:每个宏变量
&output_name对应需生成3个固定命名规则的文件,日期由宏变量&date控制 - 示例:
预期文件:DPS_cais_DPSCAIS_Interactive_Workbook_20230629.xlsm
DPS_cais_DPSCAIS_Summary_Workbook_20230629.xlsm
DPS_cais_DPSCAISappend_20230629.csv
当前已存在文件:
DPS_cais_DPSCAIS_Interactive_Workbook_20230629.xlsm
DPS_cais_DPSCAIS_Summary_Workbook_20230629.xlsm
现有代码问题分析
- DATA步逻辑错误:嵌套
SET语句导致数据读取异常,flag变量的初始化与判断逻辑混乱,无法正确标记存在的文件 - PROC SQL逻辑矛盾:
filename not in (select ... where a.filename = b.filename)等价于筛选空集,根本无法找出缺失文件 - 硬编码与规则不符:最后一段DATA步直接写死
&output_name的值(DPS_cais),且文件名规则错误(比如_append_多了下划线、Summary_Report应为Summary_Workbook)
简化实现方案
核心思路:先生成预期文件列表,再与现有文件数据集比对,直接定位缺失项,最后输出校验结果。
修正后的完整代码
/* 1. 生成预期文件列表数据集,完全使用宏变量动态生成 */ data expected_files; length filename $200; /* 按规则生成3个预期文件名 */ filename = "&output_name._DPSCAIS_Interactive_Workbook_&date..xlsm"; output; filename = "&output_name._DPSCAIS_Summary_Workbook_&date..xlsm"; output; filename = "&output_name._DPSCAISappend_&date..csv"; output; run; /* 2. 比对现有文件与预期文件,找出缺失文件并统计数量 */ proc sql; /* 生成缺失文件列表 */ create table missing_files as select e.filename from expected_files e where not exists ( select 1 from DPS_FILE_COUNT d where d.filename = e.filename ); /* 将缺失数量存入宏变量 */ select count(*) as missing_count into :missing_count from missing_files; quit; /* 3. 输出校验结果,生成状态宏变量供后续流程使用 */ data _null_; if &missing_count. > 0 then do; put "ERROR: 发现&missing_count.个缺失文件:"; set missing_files; put " - " filename; call symputx('check_status', 'FAIL'); end; else do; put "NOTE: 所有预期文件均已生成,校验通过。"; call symputx('check_status', 'PASS'); end; run; /* 打印最终校验状态 */ %put 校验状态:&check_status.;
代码优势
- 逻辑清晰:从定义预期到比对排查,步骤明确,便于维护
- 动态适配:完全依赖宏变量
&output_name和&date,无需修改代码即可适配不同输入和日期 - 结果直观:直接输出缺失文件名和校验状态,快速定位问题
内容的提问来源于stack exchange,提问作者KC0_0
相关产品推荐
相关产品推荐

