如何在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
相关产品推荐
相关产品推荐

