SAS中CAT函数未按预期工作的原因排查问询
SAS分组拼接字符串:CAT与CATS函数的差异问题
问题代码
data work.test; input id city & $30. year population; datalines; 1 Atlanta 2000 3.5 2 Atlanta 2010 4.5 3 Atlanta 2020 5.8 4 Cincinnati 2000 1.5 5 Cincinnati 2010 1.6 6 Cincinnati 2020 1.8 7 Providence 2000 1.2 8 Providence 2020 1.2 9 Chicago 2020 9.6 ; run; proc sort data=work.test; by city year; run; * 使用CATS可正常拼接,替换为CAT则仅保留首个条目; data work.test_string (keep=city popString); format popString $1000.; set work.test; retain popString; by city; if first.city then do; popString = cat(put(year,4.),': ', put(population,3.1),'M.'); /* 替换为CAT后的代码 */ end; else do; popString = cat(popString, '; ', put(year,4.),': ', put(population,3.1),'M.'); end; if last.city then output; run;
现象对比
- 使用
CATS函数时,可正确拼接每组所有年份的人口信息:
| popString | city |
|---|---|
| 2000:3.5M.;2010:4.5M.;2020:5.8M. | Atlanta |
| 2020:9.6M. | Chicago |
| 2000:1.5M.;2010:1.6M.;2020:1.8M. | Cincinnati |
| 2000:1.2M.;2020:1.2M. | Providence |
- 替换为
CAT函数后,仅保留每组的首个条目内容:
| popString | city |
|---|---|
| 2000:3.5M | Atlanta |
| 2020:9.6M. | Chicago |
| 2000:1.5M. | Cincinnati |
| 2000:1.2M. | Providence |
原因分析
问题出在CAT与CATS函数的核心差异:
CATS函数:会自动修剪所有输入参数的前导和尾随空格,再进行拼接。因此第一次赋值后,popString的有效内容末尾无多余空格,后续拼接时新内容会直接追加在有效字符之后,不会被空格占用位置。CAT函数:仅直接拼接所有输入参数,不会修剪任何空格。由于popString被定义为$1000.长度,第一次赋值后,有效字符仅占前11位左右,剩余989位都是空格。后续用CAT拼接时,新内容会被追加到这989个空格之后,超出了变量的长度范围(1000位),导致无法存入popString,最终输出时仅保留第一次赋值的有效内容(末尾空格被自动截断)。
解决方法
如果要使用CAT函数实现正确拼接,需要先用TRIM函数去除popString末尾的空格,再进行拼接:
else do; popString = cat(trim(popString), '; ', put(year,4.),': ', put(population,3.1),'M.'); end;
或者直接使用CATS/CATX函数(CATX还可指定分隔符,更适合拼接场景),它们会自动处理空格问题,无需手动修剪。
内容的提问来源于stack exchange,提问作者LR2008
相关产品推荐
相关产品推荐

