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

如何在SAS中提取字符串最后11位数字作为新变量

问题分析与解决方案

你的代码出现全缺失的核心原因有两个:

1. 数据集创建时的输入错误

原INPUT CompanyName;语句默认按空白分隔读取内容,导致每一行仅保留第一个单词,后续的公司名称后缀和ID全部丢失。必须使用$CHAR格式并指定足够长度,才能完整读入整行内容。

2. PROC SQL中的正则匹配逻辑缺陷

原代码通过截取子串再匹配全11位数字的方式,既冗余又容易出错(比如字符串长度不足11位时,substr会返回整个字符串导致匹配失败),且未考虑到数据未正确读入的前提问题。


修正后的完整代码

第一步:正确创建数据集

DATA have;
  INFILE DATALINES TRUNCOVER;
  INPUT CompanyName $char200.; /* 读入整行内容,保留所有空格和字符 */
  DATALINES;
ASASD FSFASD ASDFASDFASD
ASDFAS ADFASDF FDAFADFADF 01232143211
ADAFSAD ADSFASDF 03331286532
LKJLKJK KLKJKJL
LLKJLKJ FDAFASDF 75423243211
;
RUN;

第二步:提取末尾11位数字(两种可选方式)

方式一:正则捕获+CASE判断(简洁高效)
PROC SQL;
   CREATE TABLE WANT AS 
   SELECT 
       CompanyName,
       CASE 
           WHEN prxmatch('/\d{11}$/', CompanyName) 
               THEN prxchange('s/.*(\d{11})$/$1/', 1, CompanyName)
           ELSE ''
       END AS ID_OWNER $CHAR11.
   FROM have;
QUIT;
  • 正则.*(\d{11})$匹配任意字符后捕获末尾的11位数字;
  • $CHAR11.格式确保ID保留前导零(如01232143211不会丢失开头的0)。
方式二:CASE+SUBSTR(逻辑清晰)
PROC SQL;
   CREATE TABLE WANT AS 
   SELECT 
       CompanyName,
       CASE 
           /* 先判断字符串末尾是否为11位数字 */
           WHEN prxmatch('/\d{11}$/', CompanyName) > 0 
               /* 精准截取最后11位,指定长度避免异常 */
               THEN substr(CompanyName, length(CompanyName)-10, 11)
               ELSE '' /* 字符型缺失值 */
       END AS ID_OWNER $CHAR11.
   FROM have;
QUIT;

关键说明

  • INFILE DATALINES TRUNCOVER确保行内容长度不足指定值时,仍能完整读入整行;
  • 正则/\d{11}$直接匹配字符串末尾的11位数字,比提前截取子串的方式更可靠;
  • 定义$CHAR11.格式可以避免SAS自动去除前导零的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 20:40:36