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

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函数时,可正确拼接每组所有年份的人口信息:
popStringcity
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函数后,仅保留每组的首个条目内容:
popStringcity
2000:3.5MAtlanta
2020:9.6M.Chicago
2000:1.5M.Cincinnati
2000:1.2M.Providence

原因分析

问题出在CAT与CATS函数的核心差异:

  1. CATS函数:会自动修剪所有输入参数的前导和尾随空格,再进行拼接。因此第一次赋值后,popString的有效内容末尾无多余空格,后续拼接时新内容会直接追加在有效字符之后,不会被空格占用位置。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:13:14