楼主: linshuhe123
1788 0

[程序分享] 用sas 辨别身份证号真伪 (正则表达) [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

高中生

72%

还不是VIP/贵宾

-

威望
0
论坛币
6 个
通用积分
1.0061
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
255 点
帖子
47
精华
0
在线时间
21 小时
注册时间
2015-11-2
最后登录
2018-9-12

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
/********************************************************/
/*程序说明:身份证号码的真假识别                          */
/*******************************************************/
/*身份证是否合法的判别规则*/
data sfz_test;
input id $30.;
cards;
15040419870500061X
05210419 2008000351
3302211644560000642
43504820100900033X
43564820000900033 x
435640190 10900033x
;
run;
%macro id_card_check(dataset,id_var,lib=work,id_check_result=check_ID);
data id_card;
        set &dataset;
        id=compress(strip(&id_var));
        keep id;
run;
data check;
        if _n_=1 then do;
        array w w1-w18;
        do i=1 to 18;
                W{i}=mod(2**(i-1),11);
        end;
        end;
run;
option fmtsearch=(&lib);
data &lib..&id_check_result;
        if _n_=1 then do;
        set check;
        pattern = prxparse("/[0-9]{6}(((19|20)[0-9]{2}(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-9])))))[0-9]{3}[0-9xX]/");/*prxparse函数以正则式为输入生成一个SAS内部用于指代改正则式的id*/
        end;
        retain wd_sum pattern;
        set ID_card;
        form=prxmatch(pattern,id);
        if form=0 then check_form=1;else check_form=0;/*1:检验格式是否正确*/
                array w w1-w18;
                        format right_wd $1. ;
                        if check_form=0 then do;/*2:格式正确则检验身份证校验码码*/
                wd_sum=0;
                do i=1 to 17;
                wd_sum_cal=substr(id,i,1)*w{19-i};
                wd_sum=wd_sum+wd_sum_cal;
                end;
        wd_check=mod(wd_sum,11);
        if wd_check=0 then right_wd='1';
        else if wd_check=1 then right_wd='0';
        else if wd_check=2 then right_wd='X';
        else if wd_check=3 then right_wd='9';
        else if wd_check=4 then right_wd='8';
        else if wd_check=5 then right_wd='7';
        else if wd_check=6 then right_wd='6';
        else if wd_check=7 then right_wd='5';
        else if wd_check=8 then right_wd='4';
        else if wd_check=8 then right_wd='3';
        else if wd_check=10 then right_wd='2';
        if substr(strip(id),18,1)=right_wd then check_wd=0;else check_wd=1;/*身份证最后一位正确则check_wd=0*/
end;
        if check_wd=0 then do;/*3:格式、验证码都正确的情况下检验前两位数是否属于约定的省份*/
                if lead_wd>=11 or lead_wd<=15 then check_lwd=0;else/*11-15 京、津、冀、晋、蒙*/
                if lead_wd>=21 or lead_wd<=23 then check_lwd=0;else/*21-23 辽、吉、黑*/
                if lead_wd>=31 or lead_wd<=37 then check_lwd=0;else/*31-37 沪、苏、浙、皖、闽、赣、鲁*/
                if lead_wd>=41 or lead_wd<=46 then check_lwd=0;else/*41-46 豫、鄂、湘、粤、桂、琼*/
                if lead_wd>=50 or lead_wd<=54 then check_lwd=0;else/*50-54 渝、川、贵、云、藏*/
                if lead_wd>=61 or lead_wd<=65 then check_lwd=0;else/*61-65 陕、甘、青、宁、新*/
                if lead_wd>=81 or lead_wd<=82 then check_lwd=0;else/*81-82 港、澳*/
                check_lwd=1;
        end;
        if max(check_form,check_wd,check_lwd)=1 then result=1;else result=0;/*1为假身份证号,0为正确身份证号码*/
drop form pattern lead_wd w1-w18 right_wd wd_sum wd_sum_cal i wd_check;
run;
quit;
proc format lib=&lib;
value result 1='假身份证号' 0='正确';
run;
proc datasets lib=&lib noprint;
        modify &id_check_result;
        format result result.;
        label check_form='身份证格式检查'
        check_wd='身份证校验码检查'
        check_lwd='身份证省份码检查'
        result='验证结果';
%mend id_card_check;
%id_card_check(sfz_test,id,lib=work,id_check_result=result);
proc print data=work.result;
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:身份证号 身份证 compress PrxMatch Pattern sas 身份证正则表达式 正则 验证身份证号真假

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-27 17:58