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

[文本处理] 求助文档组合再切割的批处理

本帖最后由 lmq123 于 2023-4-19 15:36 编辑

长文档先分类_再切割批处理》
先分类:
先用批处理把srt长文档自动化分类成为示例中的样子,分类成两个文档,一个是时间文档一个是内容文档

假设内容文本是6千字则分为1和2两个文档,
如果内容文本是1万2千字则分为123三个文档
以此类推,
内容文本以很多单元组成,一段数字+一段长短不一的文字内容组成为一个单元,内容文本分割时只能以单元为基础进行分割,不能把一个单元的字符分别放在前后两个文本中,要么把这个单元放前一个文本中,要么把这个单元放在后一个文本中,假如这个单元放在前一个文本中,这个文本字符超过5000字符了,那就按四舍五入的类似原则,那就把这个单元划入下一个文本算了,
从头到尾,按这个规律分割到底就算完成了

把内容文档按小于等

段内容打开「百度网盘」APP即可获取
举例说明:


这个难度有点大,只有超级批处理大神才能解决好,求求大家帮我一下

这个。。。个人觉得付费比较合适

QQ 20147578

TOP

……我觉得换成vbs就不用超级大神了
东西长,大最好换个编译的语言
比如整个c++?

TOP

powershell 第一步
  1. chcp 65001
  2. function filesplit() {
  3.     param([string]$filename)
  4.     $a = Get-Content -Encoding UTF8 ($filename + ".srt")
  5.     $as = $a -join "`n"
  6.     $as -replace "(?m)(^\d+[.]$)`n(^.+$)`n(^.+$)","`$1`n`$2" | Out-File -Encoding utf8 ($filename + "t.srt")
  7.     $as -replace "(?m)(^\d+[.]$)`n(^.+$)`n(^.+$)","`$1`n`$3" | Out-File -Encoding utf8 ($filename + "s.srt")
  8. }
  9. filesplit "文档111"
复制代码

TOP

  1. @echo off
  2. rem 文件和批处理保存为ansi编码格式
  3. rem part1
  4. setlocal enabledelayedexpansion
  5. for /f "delims=" %%i in ('dir /b /a-d *.srt') do (
  6. set n=
  7. for /f "delims=" %%a in ('type "%%i"') do (
  8. set /a n+=1,m=n%%3
  9. if !m! equ 1 (
  10. set "str1=%%a"
  11. ) else if !m! equ 2 (
  12. >>"%%~ni时间.srt" (
  13. echo !str1!
  14. echo %%a
  15. echo;
  16. )
  17. ) else if !m! equ 0 (
  18. >>"%%~ni内容.srt" (
  19. echo !str1!
  20. echo %%a
  21. echo;
  22. )
  23. )
  24. )
  25. )
  26. endlocal
  27. rem part2
  28. setlocal enabledelayedexpansion
  29. for /f "delims=" %%i in ('dir /b /a-d *内容.srt') do (
  30. set /a n=0,fc=1,lengthAll=0
  31. for /f "delims=" %%a in ('type "%%i"') do (
  32. set /a n+=1,m=n%%2
  33. set "str=!str!%%a"
  34. set "str!m!=%%a"
  35. if !m! equ 0 (
  36. rem 内容.srt每单元不超100字符
  37. for /l %%l in (1,1,100) do (
  38. if defined str (
  39. set "str=!str:~1!"
  40. set lengthStr=%%l
  41. )
  42. )
  43. set /a lengthAll+=lengthStr
  44. if !lengthAll! gtr 5000 (
  45. set /a fc+=1,lengthAll=0
  46. )
  47. (for %%c in (1 0 #) do (
  48. echo,!str%%c!
  49. ))>>"%%~ni!fc!.srt"
  50. )
  51. )
  52. )
  53. endlocal
  54. pause
复制代码

试试行吗?
bat小白,请多指教!谢谢!

TOP

本帖最后由 lmq123 于 2023-4-19 10:36 编辑

回复 5# 77七
试验用的文档


谢谢啦

TOP

回复 5# 77七

能处理utf-8的srt文档格式吗,不是anis格式

TOP

本帖最后由 77七 于 2023-4-18 01:50 编辑

回复 6# lmq123


  
  1. @echo off
  2. rem 批处理保存为ansi,文本为utf-8时不含中文
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%i in ('dir /b /a-d *.srt') do (
  5. set /a n=0,fc=1,lengthAll=0
  6. for /f "delims=" %%a in ('type "%%i"') do (
  7. set /a n+=1,m=n%%3
  8. if !m! equ 1 (
  9. set "str1=%%a"
  10. ) else if !m! equ 2 (
  11. >>"%%~ni时间.srt" (
  12. echo !str1!
  13. echo %%a
  14. echo;
  15. )
  16. ) else if !m! equ 0 (
  17. >>"%%~ni内容.srt" (
  18. echo !str1!
  19. echo %%a
  20. echo;
  21. )
  22. set "str3=%%a!str1!"
  23. for /l %%l in (1,1,100) do (
  24. if defined str3 (
  25. set "str3=!str3:~1!"
  26. set lengthStr3=%%l
  27. )
  28. )
  29. set /a lengthAll+=lengthStr3
  30. if !lengthAll! gtr 5000 (
  31. set /a fc+=1,lengthAll=0
  32. )
  33. >>"%%~ni内容!fc!.srt" (
  34. echo !str1!
  35. echo %%a
  36. echo,
  37. )
  38. )
  39. )
  40. )
  41. endlocal
  42. pause
复制代码
bat小白,请多指教!谢谢!

TOP

本帖最后由 lmq123 于 2023-4-18 01:12 编辑

回复 8# 77七

还没试,电脑不在身边,好像我用的是没有中文汉字,只有符号数字或英文,那用第一个好点,还是用第二个好点?

另一个奇怪的问题是批处理中没有时间与内容这汉字,你怎么保证分类后生成的文档名称中含有时间与汉字这几个字

TOP

本帖最后由 lmq123 于 2023-4-19 10:36 编辑

77七你好,你的bat测试结果是失败的,它可以分类成功

另一个奇怪的地方是我想把bat批处理本身保存为anis格式,不知道为什么,批处理用记事本打开可以选anis,但是保存不了,重新打开,发现批处理还是utf-8格式,这是怎么回事

TOP

回复 10# lmq123


    这个不影响运行,不要紧

简体中文Windows的ANSI编码是GB2312

GB2312和UTF-8对英文字符的编码方式是相同的

所以一个没有中文字符、只有英文字符的ANSI编码的文件,也可视为是UTF-8编码

这并不表示bat支持UTF-8编码,因为它实际上是按ANSI编码来识别的

QQ 20147578

TOP

回复 10# lmq123


   这个字符数到底是什么意思?为什么“4月10日.srt” 这个文件的字符数 比 去掉一部分生成的 “4月10日内容.srt” 字符数还要少?请提供一个4月10日.srt 这个文件 的预期结果,我看看是什么样子的。
bat小白,请多指教!谢谢!

TOP

本帖最后由 lmq123 于 2023-4-19 10:35 编辑

回复 12# 77七

不好意思,我弄错了

TOP

本帖最后由 lmq123 于 2023-4-19 10:51 编辑

回复 8# 77七


    77七您好,我现在还有一个问题要解决就是再把时间文档与内容文档合并成一个整体,每个单元之间相隔一行,每个单元由一段数字+一段时间+一段长短不确定的中文英文数字等字符组成
时间文档是固定的每个小单元之间间隔一个空行,
但是内容文档是含有中文也含有英文数字的,而且它有2种情况,一种是每个小单元之间绝对是间隔一行的,另一种则是杂乱无章的数字与中英文字符之间是没有规律的,有可能之间隔一行,也可能是23456,,等任意空行,但是它们之间的间隔的空行数最大不会超过20行.
要把内容demo1与内容demo2分别与时间文档进行合并,当双击批处理后,能让内容1或内容2之中的任何一个与时间文档合并成合并后的样本那样子,批处理就算是成功了,不知道77七你有什么好办法可以完成


举例样本
链接:https://pan.baidu.com/s/1w-4IoXPpRg1F5e8cNJz5DA 
提取码:hyu6

TOP

回复 14# lmq123


  
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /a-d *时间*.srt') do set "filet=%%i"
  3. set "filedate=%filet:~0,-6%"
  4. for /f "delims=" %%i in ('dir /b /a-d *内容*.srt') do set "filec=%%i"
  5. copy "%filet%" "xxxt.srt"
  6. copy "%filec%" "xxxc.srt"
  7. chcp 437 1>nul
  8. setlocal enabledelayedexpansion
  9. for /f "delims=" %%a in ('type "xxxt.srt"') do (
  10. set /a n+=1,m=n%%2
  11. if !m! equ 0 set "#!n!=%%a"
  12. )
  13. set /a n=m=0
  14. for /f "delims=" %%a in ('type "xxxc.srt"') do (
  15. set /a n+=1,m=n%%2
  16. if !m! equ 0 set "##!n!=%%a"
  17. )
  18. for /l %%l in (1,1,5000) do (
  19. if defined #%%l (
  20. >>"xxxtc.srt" (
  21. set /a k+=1
  22. echo !k!
  23. echo !#%%l!
  24. echo !##%%l!
  25. echo;
  26. )
  27. )
  28. )
  29. chcp 936 1>nul
  30. del "xxxt.srt";"xxxc.srt"
  31. ren "xxxtc.srt" "%filedate%-时间+内容.srt"
  32. pause
复制代码
bat小白,请多指教!谢谢!

TOP

返回列表