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


  Quote:
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


  Quote:
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


  Quote:
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


  Quote:
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
强! 顶一个先.