You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建宏检查表名(数据集名)、列名及观测值仅含字母数字下划线,否则报错?

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:32:50