Board logo

标题: 读取文本里指定字符 解决了 [打印本页]

作者: huzixuan     时间: 2007-1-28 01:23    标题: 读取文本里指定字符 解决了

我要读取像是这样
<td class="u"><a href="http://passport.baidu.com/?detail&aid=6&default_tab=1&un=%B0%AE%BA%D5%BA%D5%B5%C4%C5%D6%D7%D3" target=_blank><font color='#000000'>爱赫赫的胖子</font></a></td>
里的用户名
爱赫赫的胖子
0.txt


就是显示 0.txt 里面的全部用户名,最好能剔除重复出现的名字

[ Last edited by huzixuan on 2007-1-29 at 12:32 AM ]
作者: ccwan     时间: 2007-1-28 01:40

for /f "tokens=4 delims=><" %%i in (test.txt) do echo %%i

作者: ccwan     时间: 2007-1-28 01:41
还以为只是一句话呢!楼主的要求总是变化的啊!
作者: ccwan     时间: 2007-1-28 01:55
到底提取什么内容?是只要为“爱赫赫的胖子”就提取还是是用户名就提取还是怎样?
作者: redtek     时间: 2007-1-28 02:06
http://zhenlove.com.cn/cndos/fileup/files/0.txt
好象是要提取这个文件~:)
作者: ccwan     时间: 2007-1-28 02:11
re redtek
如果如兄所说,那我真的不知楼主的意思了。这个网页的源代码中有五处出现”爱赫赫的胖子“,楼主是要显示五个”爱赫赫的胖子“?还是什么呢?也许兄有办法吧。
作者: huzixuan     时间: 2007-1-28 21:54
恩. 对对
就是显示 0.txt 里面的全部用户名,最好能剔除重复出现的名字
作者: redtek     时间: 2007-1-29 00:03

@echo off

for /f "tokens=3 delims=><" %%i in ('findstr ^"^</FONT^>^</A^>^</TD^>^" 0.htm') do echo %%i

Pause

作者: namejm     时间: 2007-1-29 00:14
  看看这个代码是否可行:
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('findstr /c:"td class" 0.txt') do (
    set "str=%%i"
    set "str=!str:"=!"
    if "!str:~0,12!"=="<td class=u>" (
        set "str=!str:/=\!"
        set "str=!str:<=\!"
        call :pick-up
    )
)
pause
goto :eof

:pick-up
for /f "delims=" %%i in ("%str%") do set "str=%%~dpi"
if "%str:~-2%"==">\" set "str=%str:~0,-2%"&goto pick-up
set "str=%str:>=\%"
for /f "delims=" %%i in ("%str:~0,-1%") do (
    set str=%%~nxi
    set str=!str: =!
    if not defined !str! echo !str!&set !str!=1
)
goto :eof
  简化一下,速度提升了不少:
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('findstr /c:"td class" 0.txt') do (
    set "str=%%i"
    set "str=!str:"=!"
    if "!str:~0,12!"=="<td class=u>" (
        if "!str:~-9,4!"=="</a>" (
            set "str=!str:~0,-16!"
        ) else (
            set "str=!str:~0,-12!"
        )
        set "str=!str:>=\!"
        for /f "delims=" %%j in ("!str!") do (
            set str=%%~nxj
            set str=!str: =!
            if not defined !str! echo !str!&set !str!=1
        )
    )
)
Pause
[ Last edited by namejm on 2007-1-28 at 12:40 PM ]
作者: redtek     时间: 2007-1-29 00:19
关于 “,最好能剔除重复出现的名字” 的原理以及相近代码楼主可参考下面非常精彩的帖子~:)



用批处理也可以简单实现删除文本相同行

http://www.cn-dos.net/forum/view ... =if%2Bnot%2Bdefined
作者: huzixuan     时间: 2007-1-29 00:31
哇哈哈,namejm斑竹 总是出现在最最危急的关头
并且不管问题是甚模样,任你长的、扁的、方的、圆的,在斑竹手里都能捏成一条细细长长滴     。。直.线。。
作者: ccwan     时间: 2007-1-29 00:37
redtek兄的代码非常简洁,但有点瑕疵,就是过滤掉了IP形式的用户名。

namejm兄的代码完整显示了所有用户,也过滤掉了重复用户名,但代码略嫌臃肿。

加分了。
作者: huzixuan     时间: 2007-1-29 00:39
redtek 的代码我运行后就 只提示 按任意键继续...
还有请问怎么一次加 5分的?
作者: redtek     时间: 2007-1-29 00:47
回huzixuan兄,把代码中“0.htm”改为“0.txt”就行啦,我下载那个0.txt的时候另存成了0.htm~:)

兄每发一帖就得到系统4分的加分,超过一定分数给别人加分自然就越来越高~:)
作者: ccwan     时间: 2007-1-29 00:48
呵呵,请看清楚,redtek的代码查看的是0.htm,注意文件名。

至于加分,你的级别升高后就可以了。银牌会员一次最多可以加15分。
作者: namejm     时间: 2007-1-29 01:10
  仔细观察0.txt的内容,发现用户名出现的位置不太规则,有的在</font></a></td>前是用户名,有的</font></td>前才是,更不规则的是,有的<td class="u">和<a href之间还夹杂其他字符串,比如<td class="u">10:48&nbsp; <a href="http://passport.baidu.com/?detail&aid=6&default_tab=1&un=%CB%BC%C2%B7%B3%F6%C2%B7" target=_blank><font color='#000000'> 思路出路</font></a></td>,所以,仅仅用 tokens=3 delims=>< 要漏掉很多用户名,并且会取错字符串,代码必须要有一定的复杂度才有可能完成楼主的要求。
作者: huzixuan     时间: 2007-1-29 03:11
哦!难怪呢 谢各位兄啦