Board logo

标题: 求助!从身份证编号,获取出身日期![已经解决] [打印本页]

作者: dj0733     时间: 2007-2-3 10:34    标题: 求助!从身份证编号,获取出身日期![已经解决]

452327198203062454
440682198303046336
420111197808037354
412727800515618
420221197711186191
43072419811129164
43040319751026101


以上.我有18位的号,.也有15位的ID

身份证号码与一个人的性别、出生年月、籍贯等信息是紧密相连的,无论是15位还是18位的身份证号码,其中都保存了相关的个人信息。
  15位身份证号码:第7、8位为出生年份(两位数),第9、10位为出生月份,第11、12位代表出生日期,第15位代表性别,奇数为男,偶数为女。
  18位身份证号码:第7、8、9、10位为出生年份(四位数),第11、第12位为出生月份,第13、14位代表出生日期,第17位代表性别,奇数为男,偶数为女。
  例如,某员工的身份证号码(15位)是3205219720807024,那么表示1972年8月7日出生,性别为女

我们要做的是把19720807 提取出来.
ECHO 成 YYYY-MM-DD 的格式

哪位帅哥帮帮忙..

[ Last edited by dj0733 on 2007-2-2 at 11:13 PM ]
作者: namejm     时间: 2007-2-3 11:29
  本人不帅,凑个热闹,发段代码出来:
@echo off
for /f %%i in (test.txt) do call :pickup %%i
pause
goto :eof

:pickup
set str=%1
if "%str:~15,1%"=="" (
    echo 19%str:~6,2%-%str:~8,2%-%str:~10,2%
) else (
    echo %str:~6,4%-%str:~10,2%-%str:~12,2%
)
goto :eof

作者: dj0733     时间: 2007-2-3 12:05
斑竹好强.但是能不能输出为一个TXT文件呢/>?
作者: dj0733     时间: 2007-2-3 12:12
已经解决了~加>>OK.txt
作者: dj0733     时间: 2007-2-3 12:12
谢谢班竹的热心..感激中!
作者: anqing     时间: 2007-2-3 12:28
好强,但对%1的用法,还是不解?
作者: amao     时间: 2007-2-4 12:39
我也喜欢凑热闹,基于楼主给出的数据(居然有17位的,汗~   ,这种情况应该是以x结尾的吧)。

@sed "s/ //g;/.\{17,18\}/s/.\{6\}\(.\{8\}\).*/\1/;/^.\{15\}$/s/.\{6\}\(.\{6\}\).*/19\1/" id.txt> temp.txt
@sed "s/\(.\{4\}\)\(.\{2\}\)\(.\{2\}\)/\1-\2-\3/" temp.txt> result.txt
@del temp.txt

[ Last edited by amao on 2007-2-4 at 01:45 PM ]
作者: 无奈何     时间: 2007-2-4 13:38
我也凑个 sed 的,写在一行有点长
sed -r "/[0-9]{18}/s/[^0-9]*[0-9]{6}([0-9]{4})([0-9]{2})([0-9]{2}).*/\1-\2-\3/;t;s/[^0-9]*[0-9]{6}([0-9]{2})([0-9]{2})([0-9]{2}).*/19\1-\2-\3/" file.txt

作者: amao     时间: 2007-2-4 13:50


  Quote:
Originally posted by 无奈何 at 2007-2-4 13:38:
我也凑个 sed 的,写在一行有点长

[code]
sed -r "/[0-9]{18}/s/[^0-9]*[0-9]{6}([0-9]{4})([0-9]{2})([0-9]{2}).*/\1-\2-\3/;t;s/[^0-9]*[0-9]{6}([0-9]{2})([0-9]{2})([0-9]{2}).*/19\1- ...

用了-r 扩展后看起来清爽多了。不过根据我国实际情况,18位身份证的最后一位有可能是x,所以斑竹的代码要稍微修改一下。

[ Last edited by amao on 2007-2-4 at 02:08 PM ]
作者: amao     时间: 2007-2-4 14:17
我也发个-r 扩展的

sed -r "s/ //g;/.{17,18}/s/.{6}(.{8}).*/\1/;/^.{15}$/s/.{6}(.{6}).*/19\1/;s/(.{4})(.{2})(.{2})/\1-\2-\3/" id.txt
作者: 无奈何     时间: 2007-2-4 14:18
RE amao

身份证的最后一位 x 是校验位,实际使用的是具体校验数字值,不会出现字符的。
我的脚本没有做容错处理,默认不是 18 位就是 15 位,不过可以再细化一下。
论坛里热心使用 sed 的不多,很高兴看到又多了一位 seder 。
作者: amao     时间: 2007-2-4 14:39
RE 无奈何兄:

我看了以下一个帖子,关于18位身份证,觉得好像是有以x结尾的;没有跟无奈何兄较劲的意思,因为我也想弄清楚这个问题。因为我也弄不清楚你的帖子里“实际使用”是什么意思。

http://book.hackbase.com/ask9/ask156116.htm

[ Last edited by amao on 2007-2-4 at 02:41 PM ]
作者: 无奈何     时间: 2007-2-4 15:04
RE amao

简单搜一下,兄是对的,看来我真是孤陋寡闻了,一直以为最后校验位是数字。
”较真“ 才能更好明白问题,多一些 ”较真“ 才有进步吗!
简单修正一下:
sed -r "/[0-9]{17}[0-9xX]/s/[^0-9]*[0-9]{6}([0-9]{4})([0-9]{2})([0-9]{2}).*/\1-\2-\3/;t;/[0-9]{17}/d;s/[^0-9]*[0-9]{6}([0-9]{2})([0-9]{2})([0-9]{2}).*/19\1-\2-\3/" file.txt

作者: amao     时间: 2007-2-4 17:15


  Quote:
Originally posted by 无奈何 at 2007-2-4 14:18:
RE amao

身份证的最后一位 x 是校验位,实际使用的是具体校验数字值,不会出现字符的。
我的脚本没有做容错处理,默认不是 18 位就是 15 位,不过 ...

是啊,记得以前有twf_cc兄,不过一会就不见了;还有不久前tigerpower兄也发过sed的帖子,不过很少;还有就是无奈何兄和vkill兄了;我一直很忙,所以潜水居多;难得这周比较闲,所以就发了一些帖子;下周又开始忙了,所以也不知道有没有时间像现在这样仔细的看帖发帖了。
作者: vkill     时间: 2007-2-4 17:59
呵呵,又多了位seder ,不过我更喜欢写为这样  \([0-9]\{4\}\)  ,觉得这样看起来舒服点
作者: vkill     时间: 2007-2-4 18:17
发个更长的

sed "/^\([0-9]\{17\}\)[0-9xX]*$/{s/^\([0-9]\{6\}\)\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\).*/\2-\3-\4/};/^\([0-9]\{15\}\)$/{s/^\([0-9]\{6\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\).*/19\2-\3-\4/};/^\([0-9-]\{10\}\)$/!d" test.txt