Board logo

标题: [文本处理] 批处理文本检索 [打印本页]

作者: cjiabing    时间: 2012-11-11 17:35     标题: 批处理文本检索

本帖最后由 cjiabing 于 2013-5-14 22:34 编辑

名称:批处理文本检索 Batch Text Retrieval V1.1.3
描述:这是一个批处理程序,用于检索文本信息,办公利器。假如你有一大堆文档数据,你想从这些数据中检索一些数据,则本工具可以帮你的大忙,比如搜索法律条文、查询英语单词、检索论文资料等等。
优点:程序简单,实用,快速,详细。搜索结果丰富,可导出搜索结果。速度方便比许多文本搜索类要快,搜索内容可操作性方面比系统自带的好。
缺点
1、仅部分支持doc、pdf等常用文档类型,最好转换成txt文件。
2、搜索大量文件耗时增加,为了方便二次搜索增加了一个临时文件。
3、搜索结果如果能直接定位到行,则程序就更加完美了。
4、使用findstr命令,不支持长行,搜索部分内容容易出错。
2013.05.13 更新:
1、优化搜索结果,简化代码,提高效率。
2、改善了文件搜索和定位等管理功能。
3、想使用gawk,结果发现gawk遇到文件夹就会发生错误,也不支持doc。

  1. @echo off&setlocal enabledelayedexpansion
  2. :Start
  3. title 批处理文本检索 Batch Text Retrieval V1.1.4
  4. cls&echo;&echo;
  5. echo;        【使用说明】                                    
  6. echo; ———————————————————————————————————————
  7. echo;         将文档资料转换为ANSI编码的TXT文件,并置于本程序所在目录下。
  8. echo;         使用关键词搜索,多个关键词用空格分开,如“美女 野兽 恋爱”。
  9. echo;         可用命令[Cmd、Dir、Find、Findstr]自定义搜索,如:findstr  /?
  10. echo;         
  11. echo;             [1]高级选项;        [2]文件管理;
  12. echo;             [B  Words]百度搜索。
  13. echo;         
  14. echo; ———————————————————————————————————————
  15. echo;&echo;&echo;
  16. set input=
  17. set /p "input=        请输入:"
  18. if "%input%"=="" goto Start
  19. set/a input1=input2=input3=#
  20. for /f "tokens=1,2*" %%a in ("%input%") do set "input1=%%a"&set "input2=%%b"&set "input3=%%c"
  21. if /i "%input1%"=="cmd" cmd /c %input%&goto Start
  22. if /i "%input1%"=="dir" cmd /c %input%&pause&goto Start
  23. if /i "%input1%"=="find" cmd /c %input%&pause&goto Start
  24. if /i "%input1%"=="findstr" cmd /c %input%&pause&goto Start
  25. if /i "%input1%"=="B" start "" IEXPLORE.EXE "http://www.baidu.com/s?wd=%input2%+%input3%"&goto Start
  26. if /i "%input%"=="1" call :Advanced&goto Start
  27. if /i "%input%"=="2"  (
  28.     :find
  29.     cls&echo;&echo;
  30.     echo         [1]列出所有文件名
  31.     echo         [2]导出所有文件名
  32.     echo         [3]建立目录树
  33.     echo         [4]建立文件树
  34.     echo         [5]导出目录树和文件树
  35.     echo         搜索指定文件[^<FileName^>]
  36.     echo         定位指定文件[^<FilePath^>]
  37.     echo         返回[^<Enter^>]
  38.     echo;         
  39.     set inputs=
  40.     set /p "inputs=        搜索文件:"
  41.     if "!inputs!"=="" goto Start
  42.     if /i "!inputs!"=="3" echo;&echo [目录树]&tree&echo;&pause&goto find
  43.     if /i "!inputs!"=="4" echo;&echo [文件树]&tree /f&echo;&pause&goto find
  44.     if /i "!inputs!"=="5" cd.>文件目录.txt&tree>>文件目录.txt&tree /f>>文件目录.txt&start "" 文件目录.txt&goto find
  45.     if /i "!inputs!"=="1" (
  46.         :list
  47.         echo [文件列表]
  48.         dir /b /a /s|findstr /n  .*
  49.         echo;
  50.         for /f "tokens=1 delims=:" %%a in ('dir /a /s ^|findstr /n "所列文件总数:"') do dir /a /s |more +%%a
  51.         call :FileSearch "dir /b /a /s"
  52.     )
  53.     if /i "!inputs!"=="2" (for /f "tokens=1 delims=:" %%a in ('dir /a /s ^|findstr  /n "所列文件总数:"') do dir /a /s |more +%%a>所有文件.txt
  54.         echo [所有文件]&dir /a /b /s>>所有文件.txt&start "" 所有文件.txt
  55.     )
  56.     if exist "!inputs!" start explorer /select,"!inputs!"&goto find
  57.     echo;
  58.     dir /a /b /s "*!inputs!*"|findstr /n .*
  59.     echo;
  60.     call :FileSearch "dir /a /b /s "*!inputs!*""
  61.     goto find
  62. )
  63. set "F=findstr /spina:1c "%input%" "%~dp0\*.*""
  64. for /f "tokens=1,2*" %%a in ("%input%") do call :TextSearch "%input%" %%a %%b %%c
  65. goto Start
  66. :TextSearch
  67. set "F=!F:\\=\!
  68. title 搜索 %1 . . .
  69. echo;&echo         正在搜索 %1 ,请稍候  . . .&echo         目录文件越多,需要的时间越长,请耐心等待 . . .&echo;
  70. set num=0
  71. echo ^<meta http-equiv="Content-Type" content="text/html; charset=GBK" /^>^<title^>批处理文本检索 - 批处理之家^</title^>>查询结果.htm
  72. echo ^<h1^> %1 的查询结果:^</h1^>^<small^>[快速查看]复制关键词,点击链接进入文本页面,按快捷键 Ctrl+F 调出查找对话框,粘贴关键词即可查找具体内容。建议使用 Internet Explorer 8 以上浏览器。^</small^>^<hr /^>>>查询结果.htm
  73. for /f "tokens=1-3* delims=:" %%a in ('!F!') do (
  74.     set "#S=%%d"
  75.     set "#S=!#S:%~2=<span style="BACKGROUND-COLOR: CC0000">%2</span>!"
  76.     if "%~3" neq "" set "#S=!#S:%~3=<span style="BACKGROUND-COLOR: FFFF00">%3</span>!"
  77.     if "%~4" neq "" set "#S=!#S:%~4=<span style="BACKGROUND-COLOR: 33FF00">%4</span>!"
  78.     if "%~5" neq "" set "#S=!#S:%~5=<span style="BACKGROUND-COLOR: 1E90FF">%5</span>!"
  79.     if "%~6" neq "" set "#S=!#S:%~6=<span style="BACKGROUND-COLOR: 708090">%6</span>!"
  80.     if "%%~nxb" neq "查询结果.htm" (set /a num+=1
  81.         echo ^<p^>^&nbsp;^&nbsp;^&nbsp;^&nbsp;^<strong^>!num!.^</strong^>!#S!  ——^<small^>^<a href="%%a:%%b"^>%%a:%%b^</a^> 第%%c行.^</small^>^</p^>
  82.     )
  83. )>>查询结果.htm
  84. echo ^<hr /^>^<p align="center"^>^<small^>^<a href="http://hi.baidu.com/cjiabing"^>甲兵时代 ^
  85. http://hi.baidu.com/cjiabing^</a^>^<br /^>^<a href="http://www.bathome.net"^>批处理之家 ^
  86. http://www.bathome.net^</a^>^<br /^>%date% %time%^</small^>^</p^>>>查询结果.htm
  87. start 查询结果.htm
  88. echo;&echo         搜索完成!请使用 Internet Explorer 8 以上浏览器浏览查询结果!&echo;
  89. :TextSearchs
  90. set inputs=
  91. set /p "inputs=        返回[<Enter>]二次搜索[Words]:"
  92. if "%inputs%"=="" goto :eof
  93. echo;&echo;[查询结果]:&echo;
  94. ::%F%|findstr /i "%inputs%"|findstr /ibvna:1c "查询结果.htm"
  95. for /f "tokens=* delims=<>" %%a in ('findstr /i "%inputs%" 查询结果.htm^|findstr /ibnv "查询结果.htm"') do (
  96. set "var=%%a"
  97. set "var=!var:<p>&nbsp;&nbsp;&nbsp;&nbsp;<strong>=!"
  98. set "var=!var:</strong>=!"
  99. set "var=!var:<span style=!"
  100. set "var=!var:"BACKGROUND-COLOR: CC0000">=!"
  101. set "var=!var:"BACKGROUND-COLOR: FFFF00">=!"
  102. set "var=!var:"BACKGROUND-COLOR: 33FF00">=!"
  103. set "var=!var:"BACKGROUND-COLOR: 1E90FF">=!"
  104. set "var=!var:"BACKGROUND-COLOR: 708090">=!"
  105. set "var=!var:</span>=!"
  106. set "var=!var:<small><a href=!"
  107. set "var=!var:</small></p>=!"
  108. set "var=!var:</a>=!"
  109. echo !var!&echo;&echo;
  110. )
  111. echo;&goto TextSearchs
  112. goto :eof
  113. ::修正二次搜索,避免重复执行%F%。处理"查询结果.htm"是必须考虑的办法。
  114. 打开[Num]
  115. if "%inputs%" neq " " (for /f "tokens=1,2 delims=:" %%a in (查询结果.htm) do (
  116.     if "%%b"=="%inputs%" start "" "%~dp0%%~a"&echo;&echo;        文件已经打开!在IE或TXT中“查找”[Ctrl+F]在TXT中“转到”[Ctrl+G]&echo;&pause>nul&goto TextSearchs
  117. )
  118. :Advanced
  119. cls&echo;&echo;
  120. echo;        【高级搜索】                                    
  121. echo; ———————————————————————————————————————
  122. echo;        1.模糊搜索可以获得更多的信息,具体搜索可以获得更准确的信息。
  123. echo;        2.多个关键词使用空格分开,如“美女 吃饭 衣服”。
  124. echo;        3.使用“二次搜索”以显示同时包含多个关键词的搜索结果
  125. echo;        4.支持文件类型:*.txt *.htm (部分支持其他文档类型)
  126. echo;        5.导出搜索结果:查询结果.htm
  127. echo;        6.快捷键:在IE或TXT中“查找”[Ctrl+F]在TXT中“转到”[Ctrl+G]
  128. echo;        7.跳过[^<Enter^>];返回[0]
  129. echo; ———————————————————————————————————————                              
  130. echo         【搜索关键词】
  131. echo         1.关键词,如:小说 美女 爱情
  132. set input_words=
  133. set input_wordc=
  134. set input_wordv=
  135. set input_types=
  136. set F1=
  137. set /p "input_words=        请输入:"
  138. if "!input_words!"=="" set "input_words=.*"
  139. if /i "!input_words!"=="0" goto Start
  140. echo;&echo         2.排除的、不包含的关键词
  141. set /p "input_wordv=        请输入:"
  142. if "!input_wordv!"=="" (set F1=) else (set "F1=^|findstr /i/v "!input_wordv!"")
  143. if /i "!input_wordv!"=="0" goto Advanced
  144. echo;&echo         3.将字符串作为一个关键词搜索[Y]任意搜索[Enter]
  145. set /p "input_wordc=        请输入:"
  146. if /i "!input_wordc!"=="0" goto Advanced
  147. echo;&echo         【搜索文件类型】
  148. ::echo         可自定义,多个使用空格分开;
  149. echo           如:[1]*.txt  [2]*.htm  [3]*.doc  [4]*.vcf
  150. set /p "input_types=        请输入:"
  151. if "!input_types!"=="" set "input_types=*.*"
  152. if "!input_types!"=="1" set "input_types=*.txt"
  153. if "!input_types!"=="2" set "input_types=*.htm"
  154. if "!input_types!"=="3" set "input_types=*.doc"
  155. if "!input_types!"=="4" set "input_types=*.vcf"
  156. if /i "!input_types!"=="0" goto Advanced
  157. set input_paths=
  158. set input_pathv=
  159. echo;&echo         【搜索位置】
  160. echo         1.多个使用空格分开;含有空格的路径使用双引号引住。
  161. echo           如:E:\电子书  "C:\Program Files"
  162. set /p "input_paths=        请输入:"
  163. if "!input_paths!"=="" set "input_paths="%~dp0""
  164. if /i "!input_paths!"=="0" goto Advanced
  165. echo;&echo         2.排除的、不包含的目录;排除当前目录[Y]
  166. set /p "input_pathv=        请输入:"
  167. if "!input_pathv!"=="" set "input_pathv=."
  168. if /i "!input_pathv!"=="Y" set "input_pathv="%~dp0""
  169. if /i "!input_pathv!"=="0" goto Advanced
  170. echo;&echo;
  171. echo         你准备搜索关键词 "!input_words!" ,但排除 "!input_wordv!";
  172. echo         将字符串作为一个关键词搜索 "!input_wordc!" ,或任意搜索 [Enter] ;
  173. echo         你准备搜索文件类型 "!input_types!",但排除 "!input_typev!";
  174. echo         你准备在位置 "!input_paths!" 进行搜索,但排除位置 "!input_pathv!"。
  175. echo;&echo;
  176. for %%x in (!input_paths!) do for %%i in (!input_pathv!) do if /i "%%~x" neq "%%~i" (
  177.     if /i "!input_wordc!"=="Y" (
  178.         set "F=findstr /spina:1c /c:"!input_words!" "%%~x\!input_types!" !F1!"
  179.         for /f "tokens=1,2*" %%a in ("!input_words!") do call :TextSearch "!input_words!" %%a %%b %%c
  180.     ) else (
  181.         set "F=findstr /spina:1c    "!input_words!" "%%~x\!input_types!" !F1!"
  182.         for /f "tokens=1,2*" %%a in ("!input_words!") do call :TextSearch "!input_words!" %%a %%b %%c
  183.     )
  184. ) else (
  185.         set "F=findstr /spina:1c    "!input_words!" "%~dp0\*.*""
  186.         for /f "tokens=1,2*" %%a in ("!input_words!") do call :TextSearch "!input_words!" %%a %%b %%c
  187. )
  188. goto :eof
  189. :FileSearch
  190. echo;        打开[1 Num]定位[2 Num]搜索指定文件内容[Num Words]
  191. echo;        Num 指搜索结果前的数字,即行数。返回[^<Enter^>]
  192. set input=
  193. set /p "input=        请输入:"
  194. if "!input!"=="" goto find
  195. set/a input1=input2=.
  196. for /f "tokens=1*" %%a in ("!input!") do set "input1=%%a"&set "input2=%%b"
  197. for /f "tokens=1* delims=:" %%a in ('%~1^|findstr /n  .*') do (
  198.     if  "!input1!"=="1" if !input2!==%%a echo;打开文件:%%b&start "" "%%~b"&pause&goto find
  199.     if  "!input1!"=="2" if !input2!==%%a echo;定位文件:%%b&if exist "%%~b" start explorer /select,"%%~b"&pause&goto find
  200.     if  !input1! gtr 2 if  !input1!==%%a (
  201.         set "F=findstr /spina:1c "!input2!" "%%~b""
  202.         for /f "tokens=1,2*" %%i in ("!input2!") do call :TextSearch "!input2!" %%i %%j %%k
  203.         goto find
  204.     )
  205. )
  206. goto :eof
复制代码


有关doc、pdf等三方:
本工具能搜索到部分doc、pdf文档,但有部分不支持。
第三方命令行工具可以将文档转换为txt文件,但经试验,也有许多是失败的。

[文件操作][/url] xdoc2txt - 转换 doc/xls/pdf/html... 为 txt  http://www.bathome.net/thread-22123-1-3.html
[文件操作][/url] DOC2TXT - doc 转 txt/html/rtf/dot...  http://www.bathome.net/thread-20046-1-5.html
[文件操作][/url] Word、Excel文件转文本文件:doctotext_0.12.0  http://www.bathome.net/thread-10929-1-5.html
[文件操作][/url] pdftk----命令行下操作PDF的利器  http://www.bathome.net/thread-16578-1-9.html
作者: 狱渊    时间: 2013-5-11 08:42

很好  谢谢斑竹
作者: cjiabing    时间: 2013-5-14 22:41

改编一个UTF8转ANSI的VBS(参考Batcher 的UTF82ANSI.vbs)
  1. @echo off &echo 将目录下所有 TXT 文件由 UTF8 编码转换为 ANSI 编码。&pause&md 转换结果
  2. if not exist UTF82ANSI.vbs more +5 %0>>UTF82ANSI.vbs
  3. for /f "tokens=*" %%a in ('dir /b *.txt') do UTF82ANSI.vbs "%%~a"  "转换结果\%%~a"
  4. exit
  5. 'UTF82ANSI
  6. aCode = "UTF-8"
  7. bCode = "GB2312"
  8. Set objArgs = WScript.Arguments
  9. FileUrlSrc = objArgs(0)
  10. FileUrlDst = objArgs(1)
  11. Call WriteToFile(FileUrlDst, ReadFile(FileUrlSrc, aCode), bCode)
  12. Function ReadFile(FileUrlSrc, CharSet)
  13.     Dim Str
  14.     Set stm = CreateObject("Adodb.Stream")
  15.     stm.Type = 2
  16.     stm.mode = 3
  17.     stm.charset = CharSet
  18.     stm.Open
  19.     stm.loadfromfile FileUrlSrc
  20.     Str = stm.readtext
  21.     stm.Close
  22.     Set stm = Nothing
  23.     ReadFile = Str
  24. End Function
  25. Function WriteToFile (FileUrlDst, Str, CharSet)
  26.     Set stm = CreateObject("Adodb.Stream")
  27.     stm.Type = 2
  28.     stm.mode = 3
  29.     stm.charset = CharSet
  30.     stm.Open
  31.     stm.WriteText Str
  32.     stm.SaveToFile FileUrlDst, 2
  33.     stm.flush
  34.     stm.Close
  35.     Set stm = Nothing
  36. End Function
复制代码

作者: 853122    时间: 2014-2-3 13:22

牛  




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2