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

按效率, 代码简洁度, 格式适应度给出 3 个版本:

楼主的代码果然厉害, 又简短, 又高效, 学习!
对于 findstr, 尚在学习, 一开始思路也想到这个, 但终不熟悉于是换了方向
以下所有代码中 delims= 的后面直到 " 之间的若干空格其实都是一个 TAB 字符和一个半角空格, 复制代码请再替换一下, 看了 14 楼的提醒才知道论坛有这个问题
效率版(效率优先, 对 a.txt 文件格式变动适应差, 代码简洁度其次考虑)
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "eol=[ skip=69 delims=" %%a in (a.txt) do (
  3.   if "!doneHead!"=="" (
  4.         for /f "tokens=1-4 delims=></         " %%b in ("%%a") do (
  5.           if /i "%%c"=="class="time"" (set ln=!ln! %%d %%e) else (         
  6.             if "%%b"=="tbody" (echo !ln:~1!>b.txt)&(set doneHead=done)&(set lnBeratedOffs=-3) else (         
  7.                   if /i "%%b"=="td" set ln=!ln! %%c
  8.   ) ) ) ) else ( set /a "lnBeratedOffs+=1"
  9.     if !lnBeratedOffs! equ 0 (
  10.           for /f "tokens=1 delims=<>         " %%b in ("%%a") do if /i "%%b"=="/table" (
  11.             (start b.txt)&(if exist b样本.txt comp b样本.txt b.txt /l)& exit /b
  12.           ) else for /f "tokens=7 delims=&>?<         " %%z in ("%%a") do set ln=%%z
  13.         ) else if !lnBeratedOffs! equ 2 (
  14.           (set search=sTime)&(for /f "tokens=8 delims==         " %%b in ("%%a") do set ln=!ln! http://bbs.bathome.net/%%~b)
  15.         ) else if !lnBeratedOffs! geq 6 (
  16.           if "!search!"=="sTime" (  
  17.             for /f "tokens=2,6,10,11 delims=<>         " %%b in ("%%a") do (
  18.                   if /i "%%b"=="class="time"" (set ln=!ln! %%c %%d-%%e)&set search=bold)
  19.       ) else if "!search!"=="bold" (
  20.         (set search=cause)&(for /f "tokens=2,5 delims=<>         " %%b in ("%%a") do set ln=!ln! %%b%%c)
  21.           ) else if "!search!"=="cause" (
  22.             (set search=wait)&(set lnBeratedOffs=-3)&(for /f "tokens=2 delims=<>         " %%b in ("%%a") do echo !ln! %%b>>b.txt)
  23. ) ) ) )
复制代码
简洁版(以代码简洁优先, 效率及适应性考虑次之)
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "eol=[ skip=69 delims=" %%l in (a.txt) do (
  3.   if "!doneHead!"=="" (
  4.     for /f "tokens=1-4 delims=></         " %%A in ("%%l") do (
  5.       if /i "%%A"=="tbody" (set doneHead=done)&(echo !ln:~1!>b.txt) else (
  6.             if /i "%%B"=="class="time"" (set ln=!ln! %%C %%D) else if /i "%%A"=="td" (set ln=!ln! %%B)
  7.     ) )
  8.   ) else for /f "tokens=1-17 delims==&?></         " %%A in ("%%l") do (
  9.     if /i "%%A"=="tbody" (start b.txt)&(if exist b样本.txt comp b样本.txt b.txt /l)& exit /b
  10.     if /i "%%F"=="berated" (set ln=%%K http://bbs.bathome.net/)
  11.     if /i "%%K%%L"=="ahref" (set ln=!ln!%%~M) else if /i "%%L%%M"=="ahref" (set ln=!ln!%%~N)
  12.     if /i "%%C"==""time"" (set ln=!ln! %%M %%P-%%Q)
  13.     if /i "%%E"==""bold"" (set ln=!ln! %%B%%F)
  14.     if /i "%%C"=="td" echo !ln! %%B>>b.txt
  15. ) )
复制代码
适应版(起始不采用跳过指定行数, 而是根据搜索特定字符串找到记录表头, 适应 a.txt 文件格式变动略好)
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "eol=[ delims=" %%a in (a.txt) do (
  3.   if "!doneHead!"=="" (
  4.     for /f "tokens=2 delims=         " %%b in ("%%a") do if /i "%%b"=="summary="ratelogviewer"" (set doneHead=doing)
  5.   ) else if /i "!doneHead!"=="doing" (
  6.         for /f "tokens=1-4 delims=></         " %%b in ("%%a") do (
  7.           if /i "%%c"=="class="time"" (set ln=!ln! %%d %%e) else (
  8.             if "%%b"=="tbody" (echo !ln:~1!>b.txt)&(set doneHead=done)&(set lnBeratedOffs=-3) else (
  9.                   if /i "%%b"=="td" set ln=!ln! %%c
  10.     ) ) )
  11.   ) else ( set /a "lnBeratedOffs+=1"
  12.     if !lnBeratedOffs! equ 0 (
  13.           for /f "tokens=4,7 delims=&>?<         " %%b in ("%%a") do (set ln=%%c)
  14.         ) else if !lnBeratedOffs! equ 2 (
  15.           for /f "tokens=8 delims==         " %%b in ("%%a") do (set ln=!ln! http://bbs.bathome.net/%%~b)
  16.         ) else if !lnBeratedOffs! geq 6 (
  17.           for /f "tokens=1-6,10,11 delims=<>         " %%b in ("%%a") do (
  18.                 if /i "%%c"=="class="time"" (set ln=!ln! %%g %%h-%%i) else (
  19.                   if /i "%%e"=="class="bold"" (set ln=!ln! %%c%%f) else (
  20.                     if /i "%%d"=="/td" (echo !ln! %%c>>b.txt) else (
  21.                           if /i "%%b"=="tr" (set /a "lnBeratedOffs=-1") else if /i "%%b"=="/tbody" (
  22.                             (start b.txt)&(if exist b样本.txt comp b样本.txt b.txt /l)& exit /b
  23. ) ) ) ) ) ) ) )
复制代码

[ 本帖最后由 neorobin 于 2009-12-18 15:22 编辑 ]
1

评分人数

    • batman: 有参与就是好的PB + 30

TOP

回复 16楼 的帖子

不知楼主设想的变量法是怎样的
findstr + 大变量, 代码中的 ★ 代表 TAB 字符, 请复制后作相应替换
  1. @echo off&setlocal enabledelayedexpansion & cd.>b.txt & (set /a ii=-1)
  2. (for /f "delims=" %%a in ('findstr /r "<b>< <td.*d>$" a.txt') do (
  3.   (set ln=!ln!%%a)&(set /a "ii+=1,ii%%=5")
  4.   if not defined doneHead (
  5.         if !ii! equ 4 for /f "tokens=2,5,9,10,13,16 delims=></★ " %%A in ("!ln!") do (
  6.       set ln=%%A %%B %%C %%D %%E %%F)
  7.   ) else if !ii! equ 4 (
  8.     for /f "tokens=1,2,8,12-13,16,19,23 delims=<>★ " %%A in ("!ln!") do set ln=%%A %%B %%C %%D-%%E %%F%%G %%H
  9.   ) else ( if !ii! equ 1 for /f "tokens=9,23 delims==<>★ " %%A in ("!ln!") do (
  10.           set ln=%%A http://bbs.bathome.net/%%~B
  11.   ) )
  12.   if !ii! equ 4 (set /p=!ln!<nul& echo.)&(set doneHead=yes)&(set ln=)
  13. )>>b.txt) & (start b.txt)&(if exist b样本.txt comp b样本.txt b.txt /l)& exit /b
复制代码

[ 本帖最后由 neorobin 于 2009-12-18 20:46 编辑 ]

TOP

返回列表