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

