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

如何在SAS中去除字符串中的零并在数字间插入短横线?

解决SAS中7位字符串的零处理与分段需求

针对你需要处理7位字符串:去除前导零、将非零数字段用短横线连接,同时保留末尾零块为单个0的需求,以下是可行的解决方案:

问题分析

你的示例显示核心需求是:

  • 忽略字符串开头的连续零
  • 用零作为分隔符,将非零连续数字段提取出来,用-连接
  • 如果字符串末尾是连续零,需保留一个0并通过-连接到前面的非零段

你之前使用scan函数的问题在于参数误用:scan的第四个参数是修饰符(如忽略大小写、空白等),而非要忽略的字符;且你指定的分隔符是-,但原字符串中并无该字符,导致无法正确分割。

方法一:正则表达式(简洁高效)

使用PRXCHANGE函数通过正则表达式一步处理前导零、零段替换和特殊情况:

data abc;
    set table;
    /* 1. 去除前导连续零 */
    temp = prxchange('s/^0+//', 1, var1);
    /* 2. 将连续零替换为单个短横线 */
    temp = prxchange('s/0+/-/', -1, temp);
    
    /* 3. 处理特殊场景 */
    if temp = '' then          /* 原字符串全为零的情况 */
        id = '0';
    else if substr(temp, length(temp), 1) = '-' then  /* 末尾是零段的情况 */
        id = catx('', temp, '0');
    else
        id = temp;
    
    drop temp;
run;

测试验证

  • 输入0022012 → 处理后22-12
  • 输入0018000 → 处理后18-0
  • 输入0000000 → 处理后0
  • 输入1230450 → 处理后123-45-0

方法二:Scan函数实现(分步逻辑)

如果你倾向于用scan函数实现,可先处理前导零,再提取非零段,最后补充末尾零:

data abc;
    set table;
    length id $20;
    /* 去除前导零 */
    temp = prxchange('s/^0+//', 1, var1);
    
    if temp = '' then do;  /* 全零情况 */
        id = '0';
        output;
        return;
    end;
    
    /* 提取所有非零段并连接 */
    do i = 1 to countw(temp, '0');
        segment = scan(temp, i, '0');
        if segment ne '' then do;
            id = catx('-', id, segment);
        end;
    end;
    
    /* 若原处理后字符串以零结尾,补充-0 */
    if substr(temp, length(temp), 1) = '0' then
        id = catx('-', id, '0');
    
    drop temp i segment;
run;

内容的提问来源于stack exchange,提问作者Novichok

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 09:05:54