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

SAS地址列拆分:如何提取多词街道名生成新列?

解决SAS地址列中街道名的提取问题

针对你已经完成姓名、门牌号、邮编和城市提取的情况,这里提供两种简单易上手的方法来提取街道名,适合SAS新手:

方法一:字符串截取法(无需正则,逻辑直观)

利用已知的首尾部分长度,截取中间的街道名:

DATA DmExo3.Test;
    SET DmExo3.Adresses;
    /* 提取姓名 */
    Nom = scan(Contact, 1, ' ');
    /* 提取门牌号 */
    Numero = scan(Contact, 2, ' '); 
    /* 提取邮政编码 */
    CodePostal = input(scan(Contact, -2, ' '), 5.); 
    /* 提取城市 */
    Ville = scan(Contact, -1, ' ');
    
    /* 提取街道名:先移除开头的姓名+门牌号,再移除结尾的邮编+城市 */
    /* 第一步:截掉前两个词(姓名+门牌号)及后续空格 */
    temp_after_name_num = substr(Contact, length(Nom || ' ' || Numero) + 1);
    /* 第二步:截掉末尾的邮编+城市及前面的空格 */
    temp_rue = substr(temp_after_name_num, 1, length(temp_after_name_num) - length(' ' || CodePostal || ' ' || Ville));
    /* 清除首尾多余空格 */
    Rue = strip(temp_rue);
RUN;

逻辑说明:

  1. 先计算姓名+空格+门牌号的总长度,用substr截取后面的剩余内容;
  2. 再计算空格+邮编+空格+城市的总长度,从剩余内容中截掉这部分;
  3. 最后用strip()清除街道名首尾可能出现的多余空格。

方法二:正则表达式法(代码简洁,适合固定格式地址)

如果你的地址格式稳定(姓名单词、门牌号是数字/短字符、邮编5位、城市单词),可以用正则快速替换掉前后已知部分:

DATA DmExo3.Test;
    SET DmExo3.Adresses;
    /* 提取姓名 */
    Nom = scan(Contact, 1, ' ');
    /* 提取门牌号 */
    Numero = scan(Contact, 2, ' '); 
    /* 提取邮政编码 */
    CodePostal = input(scan(Contact, -2, ' '), 5.); 
    /* 提取城市 */
    Ville = scan(Contact, -1, ' ');
    
    /* 正则替换:去掉开头的姓名+门牌号,和结尾的邮编+城市 */
    Rue = prxchange('s/^\w+\s+\S+\s+|\s+\d{5}\s+\w+$//', 1, Contact);
    /* 清除首尾多余空格 */
    Rue = strip(Rue);
RUN;

正则说明:

  • ^\w+\s+\S+\s+:匹配开头的单词姓名+空格+任意非空格门牌号+空格;
  • \s+\d{5}\s+\w+$:匹配结尾的空格+5位邮编+空格+单词城市;
  • |表示“或”,把这两部分都替换为空,剩下的就是街道名。

扩展提示:

如果门牌号包含字母(如45bis)或城市是多词(如Saint-Malo),只需微调正则即可,比如把\w+$改成\S+$匹配多词城市。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 19:45:19