中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-07-12 23:54
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 求助!从身份证编号,获取出身日期![已经解决] 查看 4,440 回复 15
楼 主 求助!从身份证编号,获取出身日期![已经解决] 发表于 2007-02-03 10:34 ·  中国 广东 广州 番禺区 广州海之光通讯技术有限公司
初级用户
★★
积分 138
发帖 55
注册 2007-02-02 05:54
19年会员
UID 78395
性别 男
状态 离线
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 ]
偶其实很喜欢批处理
2 发表于 2007-02-03 11:29 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  本人不帅,凑个热闹,发段代码出来:

@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没商量。
考虑问题复杂化,解决问题简洁化。
3 发表于 2007-02-03 12:05 ·  中国 广东 广州 番禺区 广州海之光通讯技术有限公司
初级用户
★★
积分 138
发帖 55
注册 2007-02-02 05:54
19年会员
UID 78395
性别 男
状态 离线
斑竹好强.但是能不能输出为一个TXT文件呢/>?
偶其实很喜欢批处理
4 发表于 2007-02-03 12:12 ·  中国 广东 广州 番禺区 广州海之光通讯技术有限公司
初级用户
★★
积分 138
发帖 55
注册 2007-02-02 05:54
19年会员
UID 78395
性别 男
状态 离线
已经解决了~加>>OK.txt
偶其实很喜欢批处理
5 发表于 2007-02-03 12:12 ·  中国 广东 广州 番禺区 广州海之光通讯技术有限公司
初级用户
★★
积分 138
发帖 55
注册 2007-02-02 05:54
19年会员
UID 78395
性别 男
状态 离线
谢谢班竹的热心..感激中!
偶其实很喜欢批处理
6 发表于 2007-02-03 12:28 ·  中国 吉林 四平 联通
高级用户
★★★
积分 859
发帖 413
注册 2006-08-14 21:55
19年会员
UID 60532
状态 离线
好强,但对%1的用法,还是不解?
7 发表于 2007-02-04 12:39 ·  美国 缅因州
中级用户
★★
积分 316
发帖 152
注册 2006-06-18 13:01
20年会员
UID 57204
性别 男
状态 离线
我也喜欢凑热闹,基于楼主给出的数据(居然有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 ]
8 发表于 2007-02-04 13:38 ·  中国 北京 中移铁通
荣誉版主
★★★
积分 1,338
发帖 356
注册 2005-07-15 12:09
20年会员
UID 40733
性别 男
状态 离线
我也凑个 sed 的,写在一行有点长


sed -r "/{18}/s/*{6}({4})({2})({2}).*/\1-\2-\3/;t;s/*{6}({2})({2})({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

9 发表于 2007-02-04 13:50 ·  美国 缅因州
中级用户
★★
积分 316
发帖 152
注册 2006-06-18 13:01
20年会员
UID 57204
性别 男
状态 离线
Originally posted by 无奈何 at 2007-2-4 13:38:
我也凑个 sed 的,写在一行有点长


sed -r "/{18}/s/*{6}({4})({2})({2}).*/\1-\2-\3/;t;s/*{6}({2})({2})({2}).*/19\1- ...


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

[ Last edited by amao on 2007-2-4 at 02:08 PM ]
10 发表于 2007-02-04 14:17 ·  美国 缅因州
中级用户
★★
积分 316
发帖 152
注册 2006-06-18 13:01
20年会员
UID 57204
性别 男
状态 离线
我也发个-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
11 发表于 2007-02-04 14:18 ·  中国 北京 中移铁通
荣誉版主
★★★
积分 1,338
发帖 356
注册 2005-07-15 12:09
20年会员
UID 40733
性别 男
状态 离线
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

12 发表于 2007-02-04 14:39 ·  美国 缅因州
中级用户
★★
积分 316
发帖 152
注册 2006-06-18 13:01
20年会员
UID 57204
性别 男
状态 离线
RE 无奈何兄:

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

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

[ Last edited by amao on 2007-2-4 at 02:41 PM ]
13 发表于 2007-02-04 15:04 ·  中国 北京 中移铁通
荣誉版主
★★★
积分 1,338
发帖 356
注册 2005-07-15 12:09
20年会员
UID 40733
性别 男
状态 离线
RE amao

简单搜一下,兄是对的,看来我真是孤陋寡闻了,一直以为最后校验位是数字。
”较真“ 才能更好明白问题,多一些 ”较真“ 才有进步吗!
简单修正一下:

sed -r "/{17}/s/*{6}({4})({2})({2}).*/\1-\2-\3/;t;/{17}/d;s/*{6}({2})({2})({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

14 发表于 2007-02-04 17:15 ·  美国 缅因州
中级用户
★★
积分 316
发帖 152
注册 2006-06-18 13:01
20年会员
UID 57204
性别 男
状态 离线
Originally posted by 无奈何 at 2007-2-4 14:18:
RE amao

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


是啊,记得以前有twf_cc兄,不过一会就不见了;还有不久前tigerpower兄也发过sed的帖子,不过很少;还有就是无奈何兄和vkill兄了;我一直很忙,所以潜水居多;难得这周比较闲,所以就发了一些帖子;下周又开始忙了,所以也不知道有没有时间像现在这样仔细的看帖发帖了。
15 发表于 2007-02-04 17:59 ·  中国 甘肃 兰州 城关区 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
20年会员
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
呵呵,又多了位seder ,不过我更喜欢写为这样 \([0-9]\{4\}\) ,觉得这样看起来舒服点
论坛跳转: