Board logo

标题: [文件管理] 批处理版文本文件分割器 [打印本页]

作者: lhjoanna    时间: 2008-12-17 04:47     标题: 批处理版文本文件分割器

2009/02/27更新:增加了批量分割,优化了部分代码!
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :begin
  4. color 31
  5. mode con lines=25 cols=60
  6. cls
  7. echo.
  8. echo                  ╭─────────╮
  9. echo                  |  txt文本分割器   |
  10. echo                  ╰─────────╯
  11. echo     ╔═══════════════════════╗
  12. echo     ║                                              ║
  13. echo     ║     经常在mp4上看电子书的朋友经常会遇到一个  ║
  14. echo     ║                                              ║
  15. echo     ║ 问题:不得不把下载的很长的txt文本剪切粘贴为  ║
  16. echo     ║                                              ║
  17. echo     ║ 几个小的文本,方便阅读。本工具可以实现txt文  ║
  18. echo     ║                                              ║
  19. echo     ║ 本文件的分割。可以按照自己需要进行两种分割: ║
  20. echo     ║                                              ║
  21. echo     ║ 按行分割、按字数分割。具体操作请按提示进行, ║
  22. echo     ║                                              ║
  23. echo     ║ 按字数分割算法还有待提高!                   ║
  24. echo     ║                                              ║
  25. echo     ║ 更新(09/2/27):增加了批量操作,优化了部分代码。║
  26. echo     ║                                              ║
  27. echo     ║                           code by lhjoanna   ║
  28. echo     ╚═══════════════════════╝
  29. echo.
  30. pause>nul
  31. :choice
  32. cls
  33. echo.&echo.&echo.
  34. echo        ╔════════════╗
  35. echo        ║                        ║
  36. echo        ║  [1] 批量分割          ║
  37. echo        ║                        ║
  38. echo        ║  [2] 单个文件分割      ║
  39. echo        ║                        ║
  40. echo        ║  [q] 返回上层          ║
  41. echo        ║                        ║
  42. echo        ╚════════════╝
  43. echo.
  44. echo.
  45. set /p "choice_to_cut= 请输入分割方式[1-2]:"
  46. if !choice_to_cut! equ 1 goto cut_in_batch
  47. if !choice_to_cut! equ 2 goto cut_in_single
  48. if !choice_to_cut! equ q goto begin
  49. goto choice
  50. :cut_in_batch
  51. set folder=!folder_to_cut!
  52. echo.
  53. set /p "folder_to_cut= 请把包含文本文件的文件夹拖到此窗口(q返回):"
  54. if "!folder_to_cut!" equ "q" goto choice
  55. echo.
  56. cd /d  !folder_to_cut! >nul 2>nul || echo  INPUT NOT FOLDER && pause>nul && goto
  57. cut_in_batch
  58. call :cut_ways
  59. if !code_to_cut! equ 1  for /f "delims=" %%i in ('dir /b !folder_to_cut!') do call
  60. :cut_in_line "%%i" "ok"
  61. if !code_to_cut! equ 2 ( for /f "delims=" %%i in ('dir /b !folder_to_cut!') do call
  62. :cut_in_number "%%i" "ok")
  63. if !code_to_cut! equ q goto choice
  64. if not !code_to_cut! equ 1 ( if not !code_to_cut! equ 2  goto choice )
  65. echo 分割成功完成,任意键返回!&pause>nul&goto choice
  66. :cut_in_single
  67. set /p "txt_to_cut= 请把要分割的文本文件拖到此窗口(q返回):"
  68. if !txt_to_cut! equ q goto choice
  69. cd /d  !folder_to_cut! >nul 2>nul && goto cut_in_single || echo.
  70. call :cut_ways
  71. if !code_to_cut! equ 1  call :cut_in_line "!txt_to_cut!"
  72. if !code_to_cut! equ 2  call :cut_in_number "!txt_to_cut!"
  73. if !code_to_cut! equ q goto choice
  74. if not !code_to_cut! equ 1 ( if not !code_to_cut! equ 2  goto choice )
  75. echo 分割成功完成,任意键返回!&pause>nul&goto choice
  76. :cut_ways
  77. cls
  78. echo.&echo.
  79. echo        ╔════════════╗
  80. echo        ║                        ║
  81. echo        ║  [1] 按行分割          ║
  82. echo        ║                        ║
  83. echo        ║  [2] 按字数分割        ║
  84. echo        ║                        ║
  85. echo        ║  [q] 返回上层          ║
  86. echo        ║                        ║
  87. echo        ╚════════════╝
  88. echo.
  89. echo.
  90. set code_to_cut=
  91. set /p "code_to_cut= 请输入分割方式[1-2]:"
  92. goto :eof
  93. :cut_in_line
  94. cls
  95. set "tmp=%~1"
  96. call :ex_quation_marks "!tmp!"
  97. md !txt_to_cut_name!
  98. echo.&echo  当前文件:!txt_to_cut_name!
  99. echo.&echo  正在计算文本行数,请耐心等待...
  100. for /f "tokens=1* delims=:" %%i in ('findstr /n .* "!txt_to_cut!"') do (
  101.      set lines=%%i
  102.      set line=%%j
  103.      set line=!line: =!
  104.      echo !line!>>!txt_to_cut_name!_tmp.txt
  105. )
  106. echo.&echo  共有!lines!行
  107. :check
  108. set quantity_to_cut=
  109. echo.&set /p "quantity_to_cut= 请输入每段包含的行数:"
  110. if "!quantity_to_cut!" equ "" goto check
  111. echo !quantity_to_cut!|findstr "^[0-9]*$">nul||goto check
  112. if !quantity_to_cut! leq 0 goto check
  113. if !quantity_to_cut! gtr !lines! goto check
  114. set /a a=lines/quantity_to_cut
  115. set /a b=lines%%quantity_to_cut
  116. if !b! equ 0 set /a a-=1
  117. set aa=0
  118. :loop
  119.      set c=0
  120.      set /a bb=aa+1
  121.      cd.>!txt_to_cut_name!\!txt_to_cut_name!!bb!.txt
  122.      if !aa! equ 0 (
  123.         set d=1
  124.         set /p first=<!txt_to_cut!
  125.         if "!first!" equ "" ( echo.>>!txt_to_cut_name!\!txt_to_cut_name!!bb!.txt ) else echo
  126. !first!>>!txt_to_cut_name!\!txt_to_cut_name!!bb!.txt
  127.         set /a c+=1
  128.      ) else set /a d=aa*quantity_to_cut
  129.      for /f "usebackq skip=%d% delims=" %%j in ("!txt_to_cut_name!_tmp.txt") do (
  130.          set /a c+=1
  131.          if not !c! gtr !quantity_to_cut! (
  132.             set "str=%%j"
  133.             set str=!str: =!
  134.             if "!str!" equ "" (echo.>>!txt_to_cut_name!\!txt_to_cut_name!!bb!.txt) else echo
  135. %%j>>!txt_to_cut_name!\!txt_to_cut_name!!bb!.txt
  136.          )
  137.      )
  138. set /a aa+=1
  139. if !aa! leq !a! goto loop
  140. echo.&echo  分割成功完成
  141. echo.&echo  分割后文件!txt_to_cut_name!已保存到!txt_to_cut_path!\!txt_to_cut_name!
  142. del "!txt_to_cut_name!_tmp.txt"
  143. if not "%~2" equ "" echo.&echo 准备处理下一个...
  144. ping -n 3 127.1>nul
  145. goto :eof
  146. :cut_in_number
  147. cls
  148. set "tmp=%~1"
  149. call :ex_quation_marks "!tmp!"
  150. md !txt_to_cut_name!
  151. echo.&echo  当前文件:!txt_to_cut_name!
  152. for /f "tokens=1* delims=:" %%i in ('findstr /n .* "!txt_to_cut!"') do (
  153.      set line=%%j
  154.      set line=!line: =!
  155.      echo !line!>>!txt_to_cut_name!_tmp.txt
  156. )
  157. for /f "tokens=1 delims=:" %%i in ('findstr /o .* !txt_to_cut_name!_tmp.txt') do set /a
  158. length=%%i-2
  159. set /a length/=2
  160. echo.&echo  共有!length!个字符
  161. :check2
  162. set words_to_cut=
  163. echo.&set /p "words_to_cut= 请输入每段包含的字数:"
  164. if "!words_to_cut!" equ "" goto check2
  165. echo !words_to_cut!|findstr "^[0-9]*$">nul||goto check2
  166. if !words_to_cut! leq 0 goto check2
  167. if !words_to_cut! gtr !length! goto check2
  168. set /a a=length/words_to_cut
  169. set /a b=length%%words_to_cut
  170. if not !b! equ 0 set /a a+=1
  171. set part=0
  172. :loop1
  173. set /a part+=1
  174. set /a offset_begin=(part-1)*words_to_cut
  175. set /a offset_end=part*words_to_cut
  176. set size=0
  177. cd.>!txt_to_cut_name!\!txt_to_cut_name!!part!.txt
  178. for /f "tokens=1* delims=:" %%i in ('findstr /o .* !txt_to_cut_name!_tmp.txt') do (
  179.      set /a size=%%i-2
  180.      set /a size/=2
  181.      if !size! geq !offset_begin! if !size! leq !offset_end! (
  182.         if "%%j" equ "" (echo.>>!txt_to_cut_name!\!txt_to_cut_name!!part!.txt) else echo %%
  183. j>>!txt_to_cut_name!\!txt_to_cut_name!!part!.txt
  184.      )
  185. )
  186. if !part! lss !a! goto loop1
  187. echo.&echo  分割成功完成
  188. echo.&echo  文件已保存到!txt_to_cut_path!\!txt_to_cut_name!\
  189. del "!txt_to_cut_name!_tmp.txt"
  190. if not "%~2" equ "" echo.&echo 准备处理下一个...
  191. ping -n 3 127.1>nul
  192. goto :eof
  193. :ex_quation_marks
  194.   set "txt_to_cut=%~1"
  195.   set "txt_to_cut_name=!txt_to_cut:~0,-4!"
  196.   set "txt_to_cut_path=%~dp1"
  197. goto :eof
复制代码

作者: zhgx2950    时间: 2010-4-13 16:49

楼主厉害啊,可不可以向你请教问题?
作者: caimingbing    时间: 2011-8-5 18:32

好强悍啊,收藏了?这个有用的?
作者: famersoft    时间: 2012-12-21 13:06

有一部分代码可以为我所用,谢谢
作者: martin0221    时间: 2013-1-9 10:52

楼主很强大啊
作者: 狱渊    时间: 2013-4-29 16:39

谢谢了  刚好要用
作者: ZJHJ    时间: 2013-9-15 20:59

我原来也写过按行\字节分割,按字节一般不会准确,实际上是所在行全部




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