如何创建宏检查表名(数据集名)、列名及观测值仅含字母数字下划线,否则报错?
SAS宏:检查表名、列名及观测值的命名合规性
以下是实现需求的SAS宏,会依次检查表名、列名和字符型观测值是否仅包含字母、数字和下划线,一旦发现不合规内容立即抛出错误并终止执行:
%macro check_valid_name(ds=); /* 1. 检查表名合规性 */ %if %sysfunc(prxmatch(/^[A-Za-z0-9_]+$/, &ds.)) = 0 %then %do; %put ERROR: 数据集名&ds.包含非法字符,仅允许字母、数字和下划线; %abort cancel; %end; /* 2. 获取列名并检查列名合规性 */ proc contents data=&ds. out=col_names(keep=name type) noprint; run; data _null_; set col_names; if prxmatch('/^[A-Za-z0-9_]+$/', name) = 0 then do; put "ERROR: 列名" name "包含非法字符,仅允许字母、数字和下划线"; abort cancel; end; run; /* 3. 检查字符型观测值合规性 */ proc sql noprint; select name into :char_cols separated by ' ' from col_names where type=2; /* type=2对应字符型变量 */ quit; %if &char_cols. ne %then %do; data _null_; set &ds.; array chars[*] &char_cols.; do i=1 to dim(chars); if chars[i] ne '' and prxmatch('/[^A-Za-z0-9_]/', chars[i]) then do; put "ERROR: 列" vname(chars[i]) "的观测值" chars[i] "包含非法字符,仅允许字母、数字和下划线"; abort cancel; end; end; run; %end; %put NOTE: 数据集&ds.的表名、列名及观测值均符合规则; %mend check_valid_name;
宏使用说明
- 调用方式:
%check_valid_name(ds=你的数据集名); - 检查逻辑:
- 表名检查:利用
prxmatch正则表达式匹配,确保表名仅由字母、数字、下划线组成 - 列名检查:通过
proc contents提取列名,逐个校验列名格式 - 观测值检查:仅针对字符型列,遍历每个观测值,若存在非字母/数字/下划线的字符则报错
- 表名检查:利用
- 错误处理:一旦发现不合规内容,会输出具体错误信息并通过
%abort cancel终止后续执行
内容的提问来源于stack exchange,提问作者Gujjar
相关产品推荐
相关产品推荐

