首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从SAS中的字符串识别SSN

从SAS中的字符串识别SSN
EN

Stack Overflow用户
提问于 2021-08-25 18:55:22
回答 2查看 51关注 0票数 0

我正在尝试使用SSN链接两个数据集。第一个数据集是干净的,所有SSN都以这样的格式表示: xxx-xx-xxxx。在第二个数据集中,SSN是一团糟。以下是该数据集中SSN的一些示例:*1234;#111 PUC;11111/123456789;TN# 123-45-6789;#123456789;PT # 123-45-6789;DOE,JOHN #1;1111111111111;123-45-6789;11-123-45-6789;123-45-6789/123-45-6788;11111/ 123456789;11111/ 123-45-6789

我想从乱七八糟的字符串中识别/提取9位数字(xxxxxxxxx或xxx-xx-xxxx)。

我使用了几个不同的SAS函数(index、substr、compress、length)来专门针对上面显示的示例,但我想知道是否有其他策略可用,因为我担心我会遗漏一些SSN,因为我的编程只针对我看到的这些更常用的格式。例如,下面的代码不仅笨拙,而且只能识别xxx-xx-xxxx格式的SSN(在初始破折号前没有破折号):

代码语言:javascript
复制
'''
    INDEX=INDEX(SSN,'-');
    START=INDEX-3;
    IF START <0 THEN START=.;
    SSN=SUBSTR(SSN,START,11);
    SSN2=COMPRESS(SSN,' */#-_','a');
    CHECK=LENGTH(SSN2);
    IF CHECK <9 THEN SSN2=''; 
'''

任何建议都是非常感谢的。谢谢!

EN

回答 2

Stack Overflow用户

发布于 2021-08-26 16:40:53

谢谢大家的帮助!使用你的建议,这对我很有效:

代码语言:javascript
复制
'''
data NEW;
   length SSN $11;
   re=prxparse('/(\d{3}-\d{2}-\d{4})|(\d{9})/');
   set OLD;
   if prxmatch(re, ORIGINAL_SSN) then
      do;
         SSN=prxposn(re, 0, ORIGINAL_SSN);
         output;
      end;
run;
'''
票数 1
EN

Stack Overflow用户

发布于 2021-08-26 11:02:04

正则表达式模式/\d{3}-\d{2}-\d{4}/将检测大多数SSN。现实世界的数据可能有一些奇怪的边缘情况,其中SSN查找信息不是SSN。

在许多正则表达式中,SAS可以做的事情包括:

  • filter via PRXMATCH
  • via PRXCHANGE function
  • modify via PRXPARENPRXPOSN,or PRXMATCH & SUBSTR function

更复杂的正则表达式将检测可能有效的有效构造的SSN。(从未分配过的一致性编号无效。)

来自https://secure.ssa.gov/apps10/poms.nsf/lnx/0110201035

...此外,使用以下命令标识无效的SSN:

·前三位数字(以前的区号)为"000“、"666”或900系列。

·第二组两位数(以前的组号)为“00”。

·第三组四位数(以前的序列号)为“0000”。

https://ihateregex.io/expr/ssn/非常详细地描述了复杂模式的操作:

^(?!0{3})(?!6{3})[0-8]\d{2}-?(?!0{2})\d{2}-?(?!0{4})\d{4}$

注意:我在短划线后添加了元字符?,以允许不包含短划线的SSN

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68928457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档