中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 求助!从身份证编号,获取出身日期![已经解决]
« [1] [2] »
作者:
标题: 求助!从身份证编号,获取出身日期![已经解决] 上一主题 | 下一主题
dj0733
初级用户





积分 138
发帖 55
注册 2007-2-2
状态 离线
『楼 主』:  求助!从身份证编号,获取出身日期![已经解决]

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 ]



偶其实很喜欢批处理
2007-2-3 10:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 2 楼』:  

  本人不帅,凑个热闹,发段代码出来:
@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




尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-2-3 11:29
查看资料  发短消息 网志   编辑帖子  回复  引用回复
dj0733
初级用户





积分 138
发帖 55
注册 2007-2-2
状态 离线
『第 3 楼』:  

斑竹好强.但是能不能输出为一个TXT文件呢/>?



偶其实很喜欢批处理
2007-2-3 12:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dj0733
初级用户





积分 138
发帖 55
注册 2007-2-2
状态 离线
『第 4 楼』:  

已经解决了~加>>OK.txt



偶其实很喜欢批处理
2007-2-3 12:12
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dj0733
初级用户





积分 138
发帖 55
注册 2007-2-2
状态 离线
『第 5 楼』:  

谢谢班竹的热心..感激中!



偶其实很喜欢批处理
2007-2-3 12:12
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
anqing
高级用户




积分 859
发帖 413
注册 2006-8-14
状态 离线
『第 6 楼』:  

好强,但对%1的用法,还是不解?

2007-2-3 12:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
amao
中级用户





积分 316
发帖 152
注册 2006-6-18
状态 离线
『第 7 楼』:  

我也喜欢凑热闹,基于楼主给出的数据(居然有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 12:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 8 楼』:  

我也凑个 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




  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

2007-2-4 13:38
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子  回复  引用回复
amao
中级用户





积分 316
发帖 152
注册 2006-6-18
状态 离线
『第 9 楼』:  



  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 ]

2007-2-4 13:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
amao
中级用户





积分 316
发帖 152
注册 2006-6-18
状态 离线
『第 10 楼』:  

我也发个-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:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 11 楼』:  

RE amao

身份证的最后一位 x 是校验位,实际使用的是具体校验数字值,不会出现字符的。
我的脚本没有做容错处理,默认不是 18 位就是 15 位,不过可以再细化一下。
论坛里热心使用 sed 的不多,很高兴看到又多了一位 seder 。



  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

2007-2-4 14:18
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子  回复  引用回复
amao
中级用户





积分 316
发帖 152
注册 2006-6-18
状态 离线
『第 12 楼』:  

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 14:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 13 楼』:  

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




  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

2007-2-4 15:04
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子  回复  引用回复
amao
中级用户





积分 316
发帖 152
注册 2006-6-18
状态 离线
『第 14 楼』:  



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

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

是啊,记得以前有twf_cc兄,不过一会就不见了;还有不久前tigerpower兄也发过sed的帖子,不过很少;还有就是无奈何兄和vkill兄了;我一直很忙,所以潜水居多;难得这周比较闲,所以就发了一些帖子;下周又开始忙了,所以也不知道有没有时间像现在这样仔细的看帖发帖了。

2007-2-4 17:15
查看资料  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 15 楼』:  

呵呵,又多了位seder ,不过我更喜欢写为这样  \([0-9]\{4\}\)  ,觉得这样看起来舒服点

2007-2-4 17:59
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: