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;
逻辑说明:
- 先计算
姓名+空格+门牌号的总长度,用substr截取后面的剩余内容; - 再计算
空格+邮编+空格+城市的总长度,从剩余内容中截掉这部分; - 最后用
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
相关产品推荐
相关产品推荐

