中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-18 08:19
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 求助-从一txt文档中提取email地址 查看 6,868 回复 32
16 发表于 2006-09-26 08:35 ·  中国 广东 佛山 广东睿江科技有限公司
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
Originally posted by pip at 2006-9-25 21:30:
for /f "tokens=2 delims== " %x in ('findstr "@" email.txt') do echo %~x

  pip这段代码简洁明了,代码最少,用%~x来去掉引号,出人意料,强啊。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
17 发表于 2006-09-26 09:08 ·  中国 湖南 娄底 新化县 电信
银牌会员
★★★
积分 1,218
发帖 485
注册 2006-07-21 21:24
UID 58987
来自 湖南.娄底
状态 离线
Originally posted by uime at 2006-9-26 04:50:
真的不错,谢谢大家的热心,虽然执行了,但是对for语句还是有点模糊

[ Last edited by uime on 2006-9-26 at 05:14 ]


是啊, pip兄一个环境变量扩充省了不少事, 厉害.

其实提取用户名和E-mail很容易, 难就是将他们匹配在一起. 我利用了FOR语句的循环规律, 用计数的方式实现用户名和E-mail的配对.
18 发表于 2006-09-26 09:55 ·  中国 江苏 苏州 电信
银牌会员
★★★
积分 1,181
发帖 533
注册 2006-08-14 12:54
UID 60484
状态 离线
我靠,我写了个批处理,虽然能把名字和EMAIL放一行一起搞出来,可居然要运行1分多钟。彻底失败了。 = =b
19 发表于 2006-09-26 10:08 ·  中国 广东 佛山 广东睿江科技有限公司
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  呵呵,成功提取到姓名和对应的email,速度还不错,请大家测试(如果记录有重复,则只显示其中的一条记录):

@echo off
setlocal enabledelayedexpansion
for /f "tokens=*" %%i in ('findstr "width=86 @" email.txt') do (
set first=!second!
set second=%%i
if "!first:~51,5!"=="value" set name=!first:~57,-1!
if "!second:~0,5!"=="value" (
set var=!second:~6,-18!
set "var=!var:"=!"
set "var=!var: =!"
set var=!name! !var!
)
if not "!var!"=="!str!" echo !var!^|find "@">nul && echo !var! & set str=!var!
)
pause


[ Last edited by namejm on 2006-9-26 at 22:34 ]
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
20 发表于 2006-09-26 10:13 ·  中国 甘肃 张掖 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
其实在 .html 文件里面提取东西很难的,主要是这些 < > 等等
21 发表于 2006-09-26 10:23 ·  中国 湖南 娄底 新化县 电信
银牌会员
★★★
积分 1,218
发帖 485
注册 2006-07-21 21:24
UID 58987
来自 湖南.娄底
状态 离线
namejm兄行啊, 代码执行这么快想吓死我呀...

呵呵~

[ Last edited by pengfei on 2006-9-26 at 10:24 ]
22 发表于 2006-09-26 21:23 ·  中国 湖南 娄底 新化县 电信
银牌会员
★★★
积分 1,218
发帖 485
注册 2006-07-21 21:24
UID 58987
来自 湖南.娄底
状态 离线
namejm兄19楼的代码采用了取字符方法提取, 可见兄在查找规律上下了不少功夫. 思路独到. 佩服!

我也发段速度还过得去的代码, 可以提取到非有效的E-mail地址. 但如果网页中的E-mail一栏没有任何内容将跳过不作处理.

@echo off
setlocal enabledelayedexpansion
for /f "tokens=*" %%i in ('findstr /c:"WIDTH: 80px" /c:uemail email.txt') do (
set /a num+=1
set /a term=!num!%%2
if "!term!"=="1" (
for /f "tokens=5 delims==" %%1 in ("%%i") do (
if not "%%1"=="uname></TD>" set mail=%%~1
)
) else (
for /f "tokens=2 delims== " %%2 in ("%%i") do (
if not "%%2"=="width" (
echo !mail! %%~2>>name_mail.txt
)
)
)
)
pause

经过在无任何程序干扰的情况下测试, 整段代码的执行时间为9-11毫秒(如果CPU处理频率不同可能有偏差).

19楼namejm兄代码的执行时间为11-12毫秒, 呵呵~ 秒微比你的快一点点.
23 发表于 2006-09-26 22:32 ·  中国 广东 佛山 广东睿江科技有限公司
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  在我『第 19 楼』代码的基础上,实现了文本排版,可以测试一下效果:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=*" %%i in ('findstr "width=86 @" email.txt') do (
set first=!second!
set second=%%i
if "!first:~51,5!"=="value" (
set name=!first:~57,-1!
if "!name:~2,1!"=="" (set name=!name!
) else (
if "!name:~3,1!"=="" (set name=!name!
) else (
set name=!name!
set name=!name:~0,9!
)
)
)
if "!second:~0,5!"=="value" (
set var=!second:~6,-18!
set "var=!var:"=!"
set "var=!var: =!"
set var=!name! !var!
)
if not "!var!"=="!str!" echo !var!^|find "@">nul && echo !var! & set str=!var!
)
pause
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
24 发表于 2006-09-27 02:17 ·  中国 湖南 娄底 新化县 电信
银牌会员
★★★
积分 1,218
发帖 485
注册 2006-07-21 21:24
UID 58987
来自 湖南.娄底
状态 离线
兄弟的排版速度很快, 支持! 再次利用了用户名的字符数规律实现了快速排版, 但也有局限性, 如用户名小于等于三个英文字母时, 排版会出现问题. 以兄的水平应该可以解决它.

我也发一段排版的代码, 一个不同的思路. 想了好久, 搞得我头晕. 整段代码的执行时间大约为:1秒钟多十几毫秒. 速度和namejm兄的代码没得比, 但没有局限性.

@echo off
setlocal enabledelayedexpansion
for /f "tokens=*" %%i in ('findstr /c:"WIDTH: 80px" /c:uemail email.txt') do (
set /a num+=1
set /a term=!num!%%2
if "!term!"=="1" (
for /f "tokens=5 delims==" %%1 in ("%%i") do (
if not "%%1"=="uname></TD>" set mail=%%~1
)
) else (
for /f "tokens=2 delims== " %%2 in ("%%i") do (
if not "%%2"=="width" (
set count=!mail!
call :one
echo !mail! %%~2>>name_mail.txt
)
)
)
)
pause

:one
set remove=
if not "!count:~0,1!"=="~" (
for %%1 in (a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9) do (
if /i "!count:~0,1!"=="%%1" (
set /a nem=!nem!+1
set remove=1
)
)
if "!remove!"=="" set /a nem+=2
set count=!count:~1!
goto :one
)
:two
if !nem! LSS 15 (
set /a nem+=1
set mail=!mail!
goto :two
)
set nem=
goto :eof
25 发表于 2007-02-02 23:07 ·  美国 缅因州
中级用户
★★
积分 316
发帖 152
注册 2006-06-18 13:01
UID 57204
性别 男
状态 离线
sed "/@/!d;s/.*=\(*\) .*/\1/;/\x22/s/\x22//" email.txt

[ Last edited by amao on 2007-2-6 at 06:38 PM ]
26 发表于 2007-02-02 23:29 ·  中国 吉林 四平 联通
高级用户
★★★
积分 859
发帖 413
注册 2006-08-14 21:55
UID 60532
状态 离线
真厉害
27 发表于 2007-02-03 02:41 ·  中国 广东 广州 电信
初级用户
积分 102
发帖 47
注册 2007-01-14 11:16
UID 76491
性别 男
状态 离线
不知道各位大侠可是科班出身?我等菜鸟可是难以的学会的了。
28 发表于 2007-02-03 05:02 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
Originally posted by zencome at 2007-2-2 13:41:
不知道各位大侠可是科班出身?我等菜鸟可是难以的学会的了。

  非也非也,我的专业和电脑相隔十万八千里,本人是半路出家,所以你大可不必自卑。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
29 发表于 2007-02-03 05:17 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
UID 63486
来自 河北廊坊
状态 离线
联盟的牛很多啊
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
30 发表于 2007-02-03 06:37 ·  中国 广东 广州 番禺区 广州海之光通讯技术有限公司
初级用户
★★
积分 138
发帖 55
注册 2007-02-02 05:54
UID 78395
性别 男
状态 离线
NB 呵呵.PFPF
论坛跳转: