请求修改SAS文件校验宏以支持多文件批量检测
批量文件校验SAS宏改造实现
以下是改造后的两个SAS宏,支持多文件批量检测,任一文件不满足校验条件时,错误信息会追加写入errorlog.csv:
1. 批量文件存在性校验宏 check_file_exists
该宏接收空格分隔的文件路径列表,逐个检查文件是否存在于服务器,不存在则记录错误日志:
%macro check_file_exists(file_list=, log_file=errorlog.csv); /* 首次运行时创建错误日志表头 */ %if %sysfunc(fileexist(&log_file)) = 0 %then %do; data _null_; file "&log_file" dlm=',' dsd; put '"检查类型","文件名","错误信息","检查时间"' ; run; %end; /* 循环处理每个文件 */ %let i=1; %let file=%scan(&file_list, &i, %str( )); %do %while(&file ne ); %if %sysfunc(fileexist(&file)) = 0 %then %do; data _null_; file "&log_file" dlm=',' dsd mod; /* 追加模式写入日志 */ check_type = "文件存在性校验"; filename = "&file"; error_msg = "文件不存在于服务器"; check_time = datetime(); put check_type :$quote. filename :$quote. error_msg :$quote. check_time datetime20. :$quote.; run; %end; %let i=%eval(&i+1); %let file=%scan(&file_list, &i, %str( )); %end; %mend check_file_exists;
2. 批量文件扩展名校验宏 get_FileExtension
该宏校验文件扩展名是否属于允许列表(默认支持TXT、TTX、SAS7BDAT、CSV),不匹配则记录错误日志:
%macro get_FileExtension(file_list=, allowed_ext=TXT TTX SAS7BDAT CSV, log_file=errorlog.csv); /* 首次运行时创建错误日志表头(若不存在) */ %if %sysfunc(fileexist(&log_file)) = 0 %then %do; data _null_; file "&log_file" dlm=',' dsd; put '"检查类型","文件名","错误信息","检查时间"' ; run; %end; /* 循环处理每个文件 */ %let i=1; %let file=%scan(&file_list, &i, %str( )); %do %while(&file ne ); /* 提取并转为大写的文件扩展名 */ %let ext=%upcase(%scan(&file, -1, .)); /* 校验扩展名是否在允许列表内 */ %let is_valid=0; %let j=1; %let allowed=%scan(&allowed_ext, &j, %str( )); %do %while(&allowed ne ); %if &ext = &allowed %then %do; %let is_valid=1; %let j=%eval(&j+1000); /* 匹配到后跳出循环 */ %end; %let j=%eval(&j+1); %let allowed=%scan(&allowed_ext, &j, %str( )); %end; /* 若扩展名无效,写入错误日志 */ %if &is_valid = 0 %then %do; data _null_; file "&log_file" dlm=',' dsd mod; check_type = "文件扩展名校验"; filename = "&file"; error_msg = "无效扩展名:&ext,允许的扩展名列表:&allowed_ext"; check_time = datetime(); put check_type :$quote. filename :$quote. error_msg :$quote. check_time datetime20. :$quote.; run; %end; %let i=%eval(&i+1); %let file=%scan(&file_list, &i, %str( )); %end; %mend get_FileExtension;
调用示例
定义需要校验的文件列表,依次调用两个宏完成批量检测:
/* 待校验的文件路径列表(空格分隔) */ %let target_files = /server/path/file1.txt /server/path/file2.sas7bdat /server/path/file3.xlsx /server/path/missing_file.csv; /* 执行批量存在性校验 */ %check_file_exists(file_list=&target_files); /* 执行批量扩展名校验 */ %get_FileExtension(file_list=&target_files);
关键特性
- 支持通过
file_list参数传入任意数量的文件路径 - 错误日志采用追加模式写入,保留历史校验记录
- 自动处理日志文件的初始化(首次运行创建表头)
- 扩展名校验忽略大小写,避免因大小写差异导致的误判
- 每条错误记录包含检查类型、文件名、错误详情和校验时间
内容的提问来源于stack exchange,提问作者Tirumuru Ketha
相关产品推荐
相关产品推荐

