SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

12
返回列表 发新帖
楼主: shiyiming
打印 上一主题 下一主题

sas 有验证身份证号码是否真实的函数吗

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
11#
 楼主| 发表于 2013-2-10 15:55:54 | 只看该作者

Re: sas 有验证身份证号码是否真实的函数吗

[code:1kxcyzut]

/************************************************************************************************************************************
                                 
                                                    程序介绍

第一部分 算法


1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
2、将这17位数字和系数相乘的结果相加。
3、用加出来和除以11,看余数是多少?
4、余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。
5、通过上面得知如果余数是2,身份证的最后一位号码就是罗马数字x。如果余数是10,就会在身份证的第18位数字上出现的是2。

例如:某男性的身份证号码是oooooooooooooooooX。我们要看看这个身份证是不是合法的身份证。
首先我们得出前17位的乘积和是189,然后用189除以11得出的结果是17+2/11,也就是说其余数是2。最后通过对应规则就可以知道余数2对应的是罗马数字X。
所以,可以判定这是一个合格的身份证号码。

第二部分 在数据集one中,变量id是身份证号码。

*************************************************************************************************************************************/

data two;
  set one;
  a=7*substr(id,1,1)+9*substr(id,2,1)+10*substr(id,3,1)+5*substr(id,4,1)+8*substr(id,5,1)+4*substr(id,6,1)+2*substr(id,7,1)
   +1*substr(id,8,1) +6*substr(id,9,1)+3*substr(id,10,1)+7*substr(id,11,1)+9*substr(id,12,1)+10*substr(id,13,1)+5*substr(id,14,1)
   +8*substr(id,15,1)+4*substr(id,16,1)+2*substr(id,17,1);
  b=mod(a,11);
  c=substr(id,18,1);
  select (b);
    when (0) do;
      if c="1" then d="right";
          else d="wrong";
    end;
    when (1) do;
      if c="0" then d="right";
          else d="wrong";
    end;
    when (2) do;
      if c="x" then d="right";
          else d="wrong";
    end;
    when (3) do;
      if c="9" then d="right";
          else d="wrong";
    end;
    when (4) do;
      if c="8" then d="right";
          else d="wrong";
    end;
    when (5) do;
      if c="7" then d="right";
          else d="wrong";
    end;
    when (6) do;
      if c="6" then d="right";
          else d="wrong";
    end;
    when (7) do;
      if c="5" then d="right";
          else d="wrong";
    end;
    when (8) do;
      if c="4" then d="right";
          else d="wrong";
    end;
    when (9) do;
      if c="3" then d="right";
          else d="wrong";
    end;
    when (10) do;
      if c="2" then d="right";
          else d="wrong";
    end;
        otherwise;
  end;
run;

[/code:1kxcyzut]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
12#
 楼主| 发表于 2013-3-13 15:49:51 | 只看该作者

Re: sas 有验证身份证号码是否真实的函数吗

谢谢MerlinZHOU!!
[color=#FF0000:1q2fqq7c][size=150:1q2fqq7c]15位的身份证号码如何定义验证的过程呢,也能否给出计算过程呢?

另外,15位身份证号码如何转化为18为身份证号码呢?[/size:1q2fqq7c][/color:1q2fqq7c]

[color=#00BF00:1q2fqq7c][size=150:1q2fqq7c]期待大侠现身奥~~~[/size:1q2fqq7c][/color:1q2fqq7c]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
13#
 楼主| 发表于 2013-5-24 19:31:32 | 只看该作者

Re: sas 有验证身份证号码是否真实的函数吗

你只能逻辑上验证,比如是否15位或18位,地区编码是否有,年、月、日,是否正确。其它的你没法验证,除非你可以跟公安的数据库进行比对。SAS 9.2支持C语言,自己写个验证函数还是挺容易的。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
14#
 楼主| 发表于 2013-5-27 15:16:22 | 只看该作者

Re: sas 有验证身份证号码是否真实的函数吗

没有函数,但有现成的脚本,可以看看这里

<!-- m --><a class="postlink" href="http://blog.sina.com.cn/s/blog_c181f45f0101hhm1.html">http://blog.sina.com.cn/s/blog_c181f45f0101hhm1.html</a><!-- m -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
15#
 楼主| 发表于 2013-6-23 00:17:55 | 只看该作者

Re: sas 有验证身份证号码是否真实的函数吗

这东西都知道~

[quote=&quot;MerlinZHOU&quot;:2b666xm8][code:2b666xm8]

/************************************************************************************************************************************
                                 
                                                    程序介绍

第一部分 算法


1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
2、将这17位数字和系数相乘的结果相加。
3、用加出来和除以11,看余数是多少?
4、余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。
5、通过上面得知如果余数是2,身份证的最后一位号码就是罗马数字x。如果余数是10,就会在身份证的第18位数字上出现的是2。

例如:某男性的身份证号码是oooooooooooooooooX。我们要看看这个身份证是不是合法的身份证。
首先我们得出前17位的乘积和是189,然后用189除以11得出的结果是17+2/11,也就是说其余数是2。最后通过对应规则就可以知道余数2对应的是罗马数字X。
所以,可以判定这是一个合格的身份证号码。

第二部分 在数据集one中,变量id是身份证号码。

*************************************************************************************************************************************/

data two;
  set one;
  a=7*substr(id,1,1)+9*substr(id,2,1)+10*substr(id,3,1)+5*substr(id,4,1)+8*substr(id,5,1)+4*substr(id,6,1)+2*substr(id,7,1)
   +1*substr(id,8,1) +6*substr(id,9,1)+3*substr(id,10,1)+7*substr(id,11,1)+9*substr(id,12,1)+10*substr(id,13,1)+5*substr(id,14,1)
   +8*substr(id,15,1)+4*substr(id,16,1)+2*substr(id,17,1);
  b=mod(a,11);
  c=substr(id,18,1);
  select (b);
    when (0) do;
      if c=&quot;1&quot; then d=&quot;right&quot;;
          else d=&quot;wrong&quot;;
    end;
    when (1) do;
      if c=&quot;0&quot; then d=&quot;right&quot;;
          else d=&quot;wrong&quot;;
    end;
    when (2) do;
      if c=&quot;x&quot; then d=&quot;right&quot;;
          else d=&quot;wrong&quot;;
    end;
    when (3) do;
      if c=&quot;9&quot; then d=&quot;right&quot;;
          else d=&quot;wrong&quot;;
    end;
    when (4) do;
      if c=&quot;8&quot; then d=&quot;right&quot;;
          else d=&quot;wrong&quot;;
    end;
    when (5) do;
      if c=&quot;7&quot; then d=&quot;right&quot;;
          else d=&quot;wrong&quot;;
    end;
    when (6) do;
      if c=&quot;6&quot; then d=&quot;right&quot;;
          else d=&quot;wrong&quot;;
    end;
    when (7) do;
      if c=&quot;5&quot; then d=&quot;right&quot;;
          else d=&quot;wrong&quot;;
    end;
    when (8) do;
      if c=&quot;4&quot; then d=&quot;right&quot;;
          else d=&quot;wrong&quot;;
    end;
    when (9) do;
      if c=&quot;3&quot; then d=&quot;right&quot;;
          else d=&quot;wrong&quot;;
    end;
    when (10) do;
      if c=&quot;2&quot; then d=&quot;right&quot;;
          else d=&quot;wrong&quot;;
    end;
        otherwise;
  end;
run;

[/code:2b666xm8][/quote:2b666xm8]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-5-2 19:28 , Processed in 0.069019 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表