Board logo

标题: 求助-从一txt文档中提取email地址 [打印本页]

作者: uime     时间: 2006-9-25 18:59    标题: 求助-从一txt文档中提取email地址
现有一txt文档,想提取其中的email地址 文件如下 [ Last edited by uime on 2006-9-26 at 05:27 ]
附件 1: email.txt (2006-9-25 19:00, 57.81 K, 下载附件所需积分 1点 ,下载次数: 113)

作者: namejm     时间: 2006-9-25 19:50
  试试下面的代码:
@echo off
setlocal enabledelayedexpansion
for /f "tokens=2,3 delims==@ " %%i in ('findstr @ email.txt') do (
    set var=%%i
    set "var=!var:"=!"
    echo !var!@%%j
)
pause
[ Last edited by namejm on 2006-9-25 at 19:56 ]

作者: NaturalJ0     时间: 2006-9-25 20:03
setlocal ENABLEDELAYEDEXPANSION
for /f "delims== tokens=2" %%i in ('find "@" email.txt') do (set emailtemp=%%i
echo !emailtemp:~0,-5!>>b.txt)

作者: NaturalJ0     时间: 2006-9-25 20:05
早啊,namejm ,发现你手比我快。 = =

作者: NaturalJ0     时间: 2006-9-25 20:13
不过,这句什么意思,我没看懂。 set "var=!var:"=!" 好像不写结果也一样。

作者: namejm     时间: 2006-9-25 20:37
Originally posted by NaturalJ0 at 2006-9-25 20:13: set "var=!var:"=!" 好像不写结果也一样。
如果不写这一句,那么,xliu@cqnu.edu.cn 这条记录将会在最前面的 x 处带个前引号,我也是后来测试的时候才发现的。

作者: 9527     时间: 2006-9-25 21:30
for /f "tokens=2 delims== " %x in ('findstr "@" email.txt') do echo %~x

作者: uime     时间: 2006-9-25 21:56
谢谢大家 我的问题和5楼的一样 引号好像也不配套啊 如果是同时提取用户名和email呢? 就像: name email 的格式 [ Last edited by uime on 2006-9-25 at 22:01 ]

作者: redtek     时间: 2006-9-26 00:31
Mail名与Mail地址分离:
@rem  ==================== SearchMail.Bat ==================
@echo off

for /f "tokens=2 delims== " %%i in ('findstr @ email.txt') do (
	for /f "tokens=1,2 delims=@" %%a in ("%%i") do echo %%a	%%a@%%b >> Ok_Email.txt
)

Notepad.exe Ok_Email.txt
[ Last edited by redtek on 2006-9-26 at 00:46 ]

作者: pengfei     时间: 2006-9-26 02:32
强! 顶一个先.

作者: pengfei     时间: 2006-9-26 03:30
仔细看过之后, 才发现9楼朋友的代码提取的内容并不是楼主预期的. 在写代码的过程中发现楼主的网页内容存在错误, 如: 熊明勇、刘玺、dage三个名字后面跟的并不是有效的E-mail地址, 在取E-mail时需要多用一个判断. 整段代码的工作效率是比较低的。写完这段代码, 我神智已经不清醒了, 呵呵~ 也没有进行优化。请大家测试~~~ @echo off setlocal enabledelayedexpansion for /f "tokens=5 delims==" %%i in ('findstr /i /c:"WIDTH: 80px" email.txt') do ( set /a one=!one!+1 set num=1 set two= for /f "tokens=2 delims== " %%a in ('findstr /i /c:"uemail" email.txt') do ( set /a two=!two!+1 if /i "!num!"=="1" ( if /i not "%%a"=="150><INPUT class" ( if /i not "%%i"=="uname></TD>" ( if /i "!one!"=="!two!" ( echo %%i %%~a>>name.txt set num= ) ) ) ) ) ) pause [ Last edited by pengfei on 2006-9-26 at 09:01 ]

作者: zerostudy     时间: 2006-9-26 04:16
头晕~~

作者: uime     时间: 2006-9-26 04:50
真的不错,谢谢大家的热心,虽然执行了,但是对for语句还是有点模糊 [ Last edited by uime on 2006-9-26 at 05:14 ]

作者: hushi8888     时间: 2006-9-26 04:52
可能EXCEL处理数量较少的这样的文件比较快!

作者: redtek     时间: 2006-9-26 05:00
哇噻~~爽~!!!

作者: namejm     时间: 2006-9-26 08:35
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来去掉引号,出人意料,强啊。

作者: pengfei     时间: 2006-9-26 09:08
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的配对.

作者: NaturalJ0     时间: 2006-9-26 09:55
我靠,我写了个批处理,虽然能把名字和EMAIL放一行一起搞出来,可居然要运行1分多钟。彻底失败了。 = =b

作者: namejm     时间: 2006-9-26 10:08
  呵呵,成功提取到姓名和对应的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 ]

作者: vkill     时间: 2006-9-26 10:13
其实在 .html 文件里面提取东西很难的,主要是这些 < > 等等

作者: pengfei     时间: 2006-9-26 10:23
namejm兄行啊, 代码执行这么快想吓死我呀... 呵呵~ [ Last edited by pengfei on 2006-9-26 at 10:24 ]

作者: pengfei     时间: 2006-9-26 21:23
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毫秒, 呵呵~ 秒微比你的快一点点.

作者: namejm     时间: 2006-9-26 22:32
  在我『第 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

作者: pengfei     时间: 2006-9-27 02:17
兄弟的排版速度很快, 支持! 再次利用了用户名的字符数规律实现了快速排版, 但也有局限性, 如用户名小于等于三个英文字母时, 排版会出现问题. 以兄的水平应该可以解决它. 我也发一段排版的代码, 一个不同的思路. 想了好久, 搞得我头晕. 整段代码的执行时间大约为: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

作者: amao     时间: 2007-2-2 23:07
sed "/@/!d;s/.*=\([^ ]*\) .*/\1/;/\x22/s/\x22//" email.txt [ Last edited by amao on 2007-2-6 at 06:38 PM ]

作者: anqing     时间: 2007-2-2 23:29
真厉害

作者: zencome     时间: 2007-2-3 02:41
不知道各位大侠可是科班出身?我等菜鸟可是难以的学会的了。

作者: namejm     时间: 2007-2-3 05:02
Originally posted by zencome at 2007-2-2 13:41: 不知道各位大侠可是科班出身?我等菜鸟可是难以的学会的了。
  非也非也,我的专业和电脑相隔十万八千里,本人是半路出家,所以你大可不必自卑。

作者: ccwan     时间: 2007-2-3 05:17
联盟的牛很多啊

作者: dj0733     时间: 2007-2-3 06:37
NB 呵呵.PFPF

作者: dj0733     时间: 2007-2-3 10:37
值得借鉴啊!!

作者: bbq123bbq     时间: 2007-2-5 14:59
@echo off for /f "delims== tokens=2" %%i in ('find "@" email.txt') do ( for /f %%j in ("%%i") do echo %%j >>2.txt ) Notepad.exe 2.txt

作者: mxr     时间: 2010-12-3 15:41
强! 顶一个先.