标题: 求助-从一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
强! 顶一个先.