[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【练习-054】用批处理选择性解析网页代码

出题目的:
    综合考查大家对文本的处理能力
加分原则:
    满分20分,视情况加分(以思路为重)
解题要求:
    代码高效、简洁、不生成临时文件
    另请技术组和管理层暂缓解题
题目如下:
    本人将论坛网页(我的评分)的一页源码复制到了a.txt(见附件),要求用批处理获取里面的被评分者、评分时间、
积分变动、评分理由信息,并生成b.txt如下(b.txt中所有信息都是从网页中获取的):
  1. 被评分者 评分时间 积分变动 评分理由
  2. chenxin 09-12-10-12:27 PB-20 恶意编辑
  3. chenxin 09-12-10-12:27 PB-20 恶意编辑
  4. chenxin 09-12-10-12:26 PB-20 恶意编辑
  5. chenxin 09-12-10-12:26 PB-20 恶意编辑
  6. chenxin 09-12-10-12:26 PB-20 恶意编辑
  7. chenxin 09-12-10-12:26 PB-20 恶意编辑
  8. chenxin 09-12-10-12:25 PB-20 恶意编辑
  9. chenxin 09-12-10-12:25 PB-20 恶意编辑贴子
  10. bat_fan 09-12-10-09:59 PB+5 感谢分享
  11. neorobin 09-12-9-15:25 PB+5 感谢分享
  12. 3Q3Q 09-12-9-10:47 PB-3 擅自修改标题并在标题上直呼人名
  13. ljs4r 09-12-6-21:02 PB+2 感谢主动给标题标注[已解决]字样
  14. ljs4r 09-12-4-09:05 PB+2 感谢主动给标题标注[已解决]字样
  15. neorobin 09-12-3-08:49 技术+1 好规范的代码
  16. neorobin 09-12-3-08:49 PB+20 好规范的代码
  17. summerflower 09-11-30-12:25 PB+2 感谢主动给标题标注[已解决]字样
  18. zjw767676 09-11-29-17:39 PB+5 说得对,论坛禁灌水
  19. canyue 09-11-29-16:00 PB+2 感谢主动给标题标注[已解决]字样
  20. summerflower 09-11-29-15:31 PB+2 感谢主动给标题标注[已解决]字样
  21. terse 09-11-29-10:53 PB+40 好,只是晚到了点
复制代码
完成了上一步的可以提高难度,要求获取被评分者 帖子内容预览 评分者 评分时间 积分变动 评分理由信息,并生成b.txt如下:
  1. 被评分者 帖子内容预览 评分者 评分时间 积分变动 评分理由
  2. chenxin http://bbs.bathome.net/thread-6566-1-1.html batman 09-12-10-12:27 PB-20 恶意编辑
  3. chenxin http://bbs.bathome.net/thread-6566-1-1.html batman 09-12-10-12:27 PB-20 恶意编辑
  4. chenxin http://bbs.bathome.net/thread-6432-1-1.html batman 09-12-10-12:26 PB-20 恶意编辑
  5. chenxin http://bbs.bathome.net/thread-6432-1-1.html batman 09-12-10-12:26 PB-20 恶意编辑
  6. chenxin http://bbs.bathome.net/thread-6432-1-1.html batman 09-12-10-12:26 PB-20 恶意编辑
  7. chenxin http://bbs.bathome.net/thread-6432-1-1.html batman 09-12-10-12:26 PB-20 恶意编辑
  8. chenxin http://bbs.bathome.net/thread-6432-1-1.html batman 09-12-10-12:25 PB-20 恶意编辑
  9. chenxin http://bbs.bathome.net/thread-6432-1-1.html batman 09-12-10-12:25 PB-20 恶意编辑贴子
  10. bat_fan http://bbs.bathome.net/thread-6627-1-1.html batman 09-12-10-09:59 PB+5 感谢分享
  11. neorobin http://bbs.bathome.net/thread-6655-1-1.html batman 09-12-9-15:25 PB+5 感谢分享
  12. 3Q3Q http://bbs.bathome.net/thread-6633-1-1.html batman 09-12-9-10:47 PB-3 擅自修改标题并在标题上直呼人名
  13. ljs4r http://bbs.bathome.net/thread-6625-1-1.html batman 09-12-6-21:02 PB+2 感谢主动给标题标注[已解决]字样
  14. ljs4r http://bbs.bathome.net/thread-6602-1-1.html batman 09-12-4-09:05 PB+2 感谢主动给标题标注[已解决]字样
  15. neorobin http://bbs.bathome.net/thread-6592-1-1.html batman 09-12-3-08:49 技术+1 好规范的代码
  16. neorobin http://bbs.bathome.net/thread-6592-1-1.html batman 09-12-3-08:49 PB+20 好规范的代码
  17. summerflower http://bbs.bathome.net/thread-6541-1-1.html batman 09-11-30-12:25 PB+2 感谢主动给标题标注[已解决]字样
  18. zjw767676 http://bbs.bathome.net/thread-6482-1-1.html batman 09-11-29-17:39 PB+5 说得对,论坛禁灌水
  19. canyue http://bbs.bathome.net/thread-6534-1-1.html batman 09-11-29-16:00 PB+2 感谢主动给标题标注[已解决]字样
  20. summerflower http://bbs.bathome.net/thread-6531-1-1.html batman 09-11-29-15:31 PB+2 感谢主动给标题标注[已解决]字样
  21. terse http://bbs.bathome.net/thread-6467-1-1.html batman 09-11-29-10:53 PB+40 好,只是晚到了点
复制代码
注:http://bbs.bathome.net/这部分可自行加上去,计分同时提高到30分。
链接: https://pan.baidu.com/s/1t4QIOnDCEPgmGmULIjdOug 提取码: nvqt
***共同提高***

原来跟我文本的版本不一样..=.=
加了个括号, 1,5,8 改1,5,8*
  1. @echo off
  2. set /a n=0
  3. for /f "delims=*" %%i in ('findstr /i /n "class=.time." a.txt') do (
  4.         set "var=%%i"
  5.         setlocal enabledelayedexpansion
  6.         if !n! LEQ 0 (
  7.             for /f "tokens=4 delims=:<>" %%a in ("!var!") do (
  8.                 set top=%%a
  9.                 set top=!top:/=      !
  10.                 echo !top!
  11.               )
  12.         )else (
  13.             for /f "tokens=1,5,8* delims=:<>" %%a in ("!var!") do (
  14.                 set /a cow=%%a
  15.                 set "uname=%%b"
  16.                 set "pbdate=%%c"
  17.                 set "d=%%d"
  18.                 set "pbdate=!pbdate: =-!:!d:~0,2!"
  19.                 set/p=!uname! !pbdate! <nul
  20.                 call :getpb !cow!
  21.               )
  22.         )
  23.         endlocal
  24.         set /a n+=1
  25. )
  26. pause
  27. goto :eof
  28. :getpb
  29. for /f "skip=%1 tokens=3,5 delims=<>" %%x in (a.txt) do (
  30.     set /a l+=1
  31.     if !l! EQU 1 (set/p=%%x%%y <nul )  else (
  32.         set/p=%%x <nul
  33.         echo,
  34.         goto :eof
  35.     )
  36. )
复制代码

[ 本帖最后由 caruko 于 2009-12-14 11:56 编辑 ]
1

评分人数

    • batman: 为你的参与加分,继续努力PB + 3

TOP

没考虑太多代码效率等其它因素,发个先,后面再改进吧

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('findstr "</td>" a.txt') do (
  3.     set/a n+=1
  4.     set str!n!=%%i
  5. )
  6. echo 被评分者 评分时间 积分变动 评分理由>b.txt
  7. for /l %%i in (6,1,%n%) do (
  8.     set/a num+=1
  9.     set/a s=%%i%%5
  10.     if !s! equ 1 (
  11.        for /f "tokens=4 delims=<>" %%j in ("!str%%i!") do set/p=%%j  <nul>>b.txt)
  12.     if !s! equ 3 (
  13.        for /f "tokens=7 delims=<>" %%k in ("!str%%i!") do set/p=%%k  <nul>>b.txt)
  14.     if !s! equ 4 (
  15.        for /f "tokens=5 delims=<>" %%l in ("!str%%i!") do set/p=%%l  <nul>>b.txt)
  16.     if !s! equ 0 (
  17.        for /f "tokens=3 delims=<>" %%m in ("!str%%i!") do echo %%m>>b.txt)
  18. )
  19. pause
复制代码

[ 本帖最后由 pumahxh 于 2009-12-11 20:41 编辑 ]
1

评分人数

TOP

回复 3楼 的帖子

1、结果肯定不是很正确,时间的输出格式是09-12-4-09:05,PB的输出应该是PB+5式样(都要处理其中的空格)。

2、我在顶楼要求b.txt中所有信息都要从网页源码中获取,即你并不知道要提取的信息具体内容,所以echo 被评分者 评分时间 积分
变动 评分理由>b.txt有点投机了。

3、效率上是存在着一定的问题,具体也不多说了。

4、总之完成的还可以,继续加油!
***共同提高***

TOP

回复 2楼 的帖子

if !l! EQU 1 set/p=%%x%%y <nul  else ( 这是什么语法?

另结果不正确。。。
***共同提高***

TOP

&&我之所以在顶楼要求技术组和管理层暂不解题,就是想留给大家更多独立思考的时间,所以请大家都动脑想一想,动手练一练,

同时这样的问题你们在现实中是很有可能遇到的,只要独立解出了此题,相信以后你们碰到同样的问题,处理起来一定会得手应手。
***共同提高***

TOP

从15:00做到19:00...chenxin的OK了后面的不行吖....汗
无语,我讨厌大型数据

TOP

回复 7楼 的帖子

依我的理解,应该不会出现兄弟这样的情况,不知兄弟用的是什么方法,逐行判断处理?
***共同提高***

TOP

谢谢楼主出的好题

楼主的题目非常好,在实际工作中很有借鉴意义,希望高手暂缓出手,等我们写完了,你们再指点,给出更好的解法。谢谢大家!

TOP

做点小小的提示:

    1、充分利用findstr的正则来解题。

    2、尽量采用一次性读取和输出以提高效率,即读取和输出同时进行。

    3、在获取链接地址时注意处理引号技巧的运用。
***共同提高***

TOP

按要求改进后的,感觉代码比较繁琐,请LZ指导

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('findstr /i "</td> <b><a" a.txt') do (
  3.     set/a n+=1
  4.     set str!n!=%%i
  5. )
  6. for /l %%i in (1,1,5) do (
  7.     for /f "tokens=3 delims=<>" %%j in ("!str%%i!") do set "T=%%j"&set "T=!T:/=   !"
  8.     set/p=!T! <nul>>b.txt   
  9. )
  10. echo.>>b.txt
  11. for /l %%i in (6,1,%n%) do (
  12.     set/a s=%%i%%6
  13.     if !s! equ 0 (
  14.        for /f "tokens=4 delims=<>" %%j in ("!str%%i!") do set/p=%%j  <nul>>b.txt)
  15.     if !s! equ 1 (
  16.        for /f "tokens=8 delims== " %%k in ("!str%%i!") do set/p=http://bbs.bathome.net/%%~k  <nul>>b.txt)
  17.     if !s! equ 3 (
  18.        for /f "tokens=4,7 delims=<>" %%l in ("!str%%i!") do (
  19.                  set/p=%%l  <nul>>b.txt
  20.                  set dt=%%m
  21.                  set dt=!dt: =-!
  22.                  set/p=!dt!  <nul>>b.txt))
  23.     if !s! equ 4 (
  24.        for /f "tokens=3,5 delims=<>" %%m in ("!str%%i!") do (
  25.                  set pb=%%m
  26.                  set pb=!pb: =!
  27.                  set/p=!pb!%%n  <nul>>b.txt))
  28.     if !s! equ 5 (
  29.        for /f "tokens=3 delims=<>" %%n in ("!str%%i!") do echo %%n>>b.txt)
  30. )
  31. pause
复制代码

TOP

原帖由 batman 于 2009-12-12 20:40 发表
做点小小的提示:

    1、充分利用findstr的正则来解题。

    2、尽量采用一次性读取和输出以提高效率,即读取和输出同时进行。

    3、在获取链接地址时注意处理引号技巧的运用。

请问LZ,你提到的提示第2点:读出和输出同时进行,是什么意思?是读出a.txt的信息时,同时输出b.txt吗?在一个for语句中进行?
在获取链接地址时,我用"delims=""或"delims="""都得不到地址,最后用"delims= "才得到,特别是用"delims=""还报错!
用一个for一边读取一边输出,我改了下代码,不知是不是这样,但在程序开头和结尾加echo %time%来测算时间,和我前一种方法时间看不出差别。
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('findstr /i "</td> <b><a" a.txt') do (
  3.     set/a n+=1
  4.     if !n! lss 6 (
  5.            for /f "tokens=3 delims=<>" %%j in ("%%i") do set "T=%%j"&set "T=!T:/=   !"
  6.            set/p=!T! <nul>>b.txt   
  7.            if !n! equ 5 echo.>>b.txt) else (
  8.     set/a s=!n!%%6
  9.     if !s! equ 0 (
  10.        for /f "tokens=4 delims=<>" %%j in ("%%i!") do set/p=%%j  <nul>>b.txt)
  11.     if !s! equ 1 (
  12.        for /f "tokens=8 delims== " %%k in ("%%i!") do set/p=http://bbs.bathome.net/%%~k  <nul>>b.txt)
  13.     if !s! equ 3 (
  14.        for /f "tokens=4,7 delims=<>" %%l in ("%%i!") do (
  15.                  set/p=%%l  <nul>>b.txt
  16.                  set dt=%%m
  17.                  set dt=!dt: =-!
  18.                  set/p=!dt!  <nul>>b.txt))
  19.     if !s! equ 4 (
  20.        for /f "tokens=3,5 delims=<>" %%m in ("%%i!") do (
  21.                  set pb=%%m
  22.                  set pb=!pb: =!
  23.                  set/p=!pb!%%n  <nul>>b.txt))
  24.     if !s! equ 5 (
  25.        for /f "tokens=3 delims=<>" %%n in ("%%i!") do echo %%n>>b.txt)
  26.                  )
  27. )
  28. pause
复制代码

[ 本帖最后由 pumahxh 于 2009-12-12 23:24 编辑 ]
1

评分人数

    • batman: good,但代码还可简化。PB + 15

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. echo 被评分者 评分时间 积分变动   评分理由
  3. for /f "skip=6 delims=" %%i in ('findstr "td" _a.txt') do (
  4. set /a n+=1
  5. set var=!var!%%i
  6. if !n!==6 (
  7. set foo=!var!
  8. set foo=!foo: =!
  9. set foo=!foo: =!
  10. for /f "tokens=3,13,16,18,22 delims=<>" %%a in ("!foo!") do (
  11. set flag=%%b
  12. call:sub %flag%
  13. call,echo/%%a        %%flag%%      %%c%%d    %%e
  14. )
  15. set var=
  16. set n=0
  17. )
  18. )
  19. pause>nul
  20. :sub
  21. set dt=%flag:~,-5%
  22. set tm=%flag:~-5%
  23. set "flag=%dt% %tm%"
  24. goto :eof
复制代码

[ 本帖最后由 asnahu 于 2009-12-13 09:04 编辑 ]
1

评分人数

    • batman: 长变量,好思路!PB + 12

TOP

回复 13楼 的帖子

1、论坛是不能处理tab的,所以贴出带有tab的代码时,最好要说明下哪些空格实际上tab。

2、echo 被评分者        评分时间        积分变动   评分理由违反题意。

3、既然开了变量延迟为什么还要用call,这样会代码运行影响效率。

4、时间中的空格没有处理好。

5、这种长变量的方法很好,思路好。
***共同提高***

TOP

回复 12楼 的帖子

之所以看不出你上下两段代码的效率的区别,我想原因有二:

1、你12楼的代码中有大量的冗余操作,导致代码效率降低。

2、处理的数据量不是很大,所以在时间比较上看不出太大的差别。
***共同提高***

TOP

返回列表