Board logo

标题: [文本处理] 批处理如何检测srt每行字数,超出设定字数换行? [打印本页]

作者: 小白来了    时间: 2023-11-1 12:13     标题: 批处理如何检测srt每行字数,超出设定字数换行?

大佬们好,想批量检测多个srt文件每行的字数,超出30个字加空格或者换行

不检测时间码,只检测每一行的字数~

两个文件如下

链接:https://pan.baidu.com/s/1-xmRDW2-5L3JQB6YBOtsvg?pwd=0ydb
作者: Five66    时间: 2023-11-1 19:43

哪里的标点符号?文件里的?什么类型的文件?txt,html,word?这些文件又放在哪里?
什么样的标点符号?中文标点?英文标点?日文标点?还是所有语言的标点?空格,制表符之类的算标点不?
显示出来是显示到哪里?显示到控制台?添加逗号是添加什么逗号?是逗号这两个字不?
作者: czjt1234    时间: 2023-11-2 09:20

回复 2# Five66


    有点严谨的么
作者: 小白来了    时间: 2023-11-2 09:49

回复 2# Five66


    大佬,还在吗?再看一下吧,这样应该明确了
作者: 小白来了    时间: 2023-11-2 09:50

回复 3# czjt1234


    大佬,上午好
作者: Batcher    时间: 2023-11-2 09:54

回复 1# 小白来了


    请找几个srt文件作为例子打包上传到网盘
作者: 小白来了    时间: 2023-11-2 10:08

回复 6# Batcher


    大佬好,每个srt里面内容如下:只检测那一行文字,没有标点符号。检测文字字数。这是notpad打开的。



1
00:00:00,026 --> 00:00:00,852
批处理之家

2
00:00:00,952 --> 00:00:01,812
是个非常好的平台

3
00:00:01,912 --> 00:00:02,617
我爱批处理之家我爱批处理之家我爱批处理之家我爱批处理之家
作者: 小白来了    时间: 2023-11-2 14:32

回复 6# Batcher


    大佬,我把2个srt文件传网盘了,您抽时间给看下吧~

  就是把每一行文字比较长的根据设定的字数换行~
  1. 链接:https://pan.baidu.com/s/1-xmRDW2-5L3JQB6YBOtsvg?pwd=0ydb
  2. 提取码:0ydb
复制代码

作者: qixiaobin0715    时间: 2023-11-2 15:22

  1. @echo off
  2. chcp 65001>nul
  3. for /f "delims=" %%i in ('dir /b /a-d *.srt') do (
  4.     (for /f "delims=" %%j in ('type "%%i") do (
  5.         set "str=%%j"
  6.         setlocal enabledelayedexpansion
  7.         if not "!str:~30!"=="" (
  8.             echo,!str:~,30!
  9.             echo,!str:~30!
  10.         ) else (
  11.             echo,%%j
  12.         )
  13.         endlocal
  14.     ))>"New-%%i"
  15. )
复制代码

作者: 小白来了    时间: 2023-11-2 16:59

回复 9# qixiaobin0715


    大哥好,生成的srt是空白的~ 哪里需要修改一下呢?
作者: 小白来了    时间: 2023-11-2 17:13

回复 6# Batcher


    大佬在吗?我这个srt的不好弄吗?
作者: Batcher    时间: 2023-11-2 18:03

回复 10# 小白来了


请参考Q-04把9楼.bat文件保存为UTF-8编码:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA
作者: 小白来了    时间: 2023-11-2 19:49

回复 12# Batcher


    UTF-8也是生成的空白文件。是因为srt文件格式吗
作者: buyiyang    时间: 2023-11-2 20:01

回复 13# 小白来了


    9楼代码第四行
  1.     (for /f "delims=" %%j in ('type "%%i"') do (
复制代码

作者: Five66    时间: 2023-11-2 21:19

本帖最后由 Five66 于 2023-11-3 02:40 编辑

试试下面的看看吧,没有百度账号,下不了网盘文件
srt编码gbk或ansi,srt文件名不要以new_开头(因为会生成以new_开头的新的srt文件)
  1. @echo off&chcp 936
  2. set changdu=30
  3. for %%a in (*.srt) do (
  4. cd.>"new_%%~na.newnew"
  5. set "newfile=new_%%~na.newnew"
  6. for /f "delims=" %%b in ('findstr /n .* "%%a"') do (
  7. set line=%%b
  8. setlocal enabledelayedexpansion
  9. set line=!line:*:=!
  10. if not defined line (
  11. rem echo,>>"!newfile!"
  12. echo,>>"!newfile!"
  13. ) else if "!line:~%changdu%!" == "" (
  14. rem echo,!line:*:=!>>"!newfile!"
  15. echo,!line!>>"!newfile!"
  16. ) else (
  17. set n=0
  18. set /a m=%changdu%
  19. rem set line=!line:*:=!
  20. call :aaa
  21. )
  22. endlocal
  23. )
  24. )
  25. rename *.newnew *.srt
  26. del *.newnew 2>nul
  27. echo done&pause&exit/b
  28. :aaa
  29. echo,!line:~%n%,%changdu%!>>"!newfile!"
  30. set /a n+=%changdu%
  31. set /a m+=%changdu%
  32. if "!line:~%m%!" neq "" (goto :aaa) else (
  33. if "!line:~%n%!" neq "" echo,!line:~%n%!>>"!newfile!"
  34. )
复制代码

作者: 77七    时间: 2023-11-2 21:34

  1. @echo off
  2. rem 批处理保存为utf-8编码格式
  3. chcp 65001 >nul
  4. for /f "delims=" %%i in ('dir /b /a-d *.srt') do (
  5. (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<"%%i"') do (
  6. if "%%b" equ "" (
  7. echo=
  8. ) else (
  9. set "str=%%b"
  10. setlocal enabledelayedexpansion
  11. call :1
  12. endlocal
  13. )
  14. ))>"%%~ni_2%%~xi"
  15. )
  16. pause & exit
  17. :1
  18. echo !str:~0,30!
  19. set "_str=!str:~30!"
  20. if "!_str!" neq "" (
  21. set "str=!_str!"
  22. goto :1
  23. ) else (
  24. exit /b
  25. )
复制代码

作者: 小白来了    时间: 2023-11-3 00:47

回复 14# buyiyang


    厉害了我的哥!技术专业!谢谢谢谢!
作者: 小白来了    时间: 2023-11-3 00:48

回复 15# Five66


    感谢大佬!谢谢
作者: 小白来了    时间: 2023-11-3 01:22

回复 16# 77七


大佬好,感谢您!还有一点小问题~

如果时间码超过字数的话 也会跟着换行。能否只检测文字,不检测数字时间码呢?

时间码格式:00:09:30,401 --> 00:09:30,971
作者: 77七    时间: 2023-11-3 08:12

回复 19# 小白来了


  
  1. @echo off
  2. rem 批处理保存为utf-8编码格式
  3. chcp 65001 >nul
  4. for /f "delims=" %%i in ('dir /b /a-d *.srt') do (
  5. (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<"%%i"') do (
  6. if "%%b" equ "" (
  7. echo=
  8. ) else (
  9. set "str=%%b"
  10. setlocal enabledelayedexpansion
  11. set "_str=!str:~0,1!"
  12. if !_str! gtr Z (
  13. call :1
  14. ) else (
  15. echo !str!
  16. )
  17. endlocal
  18. )
  19. ))>"%%~ni_2%%~xi"
  20. )
  21. pause & exit
  22. :1
  23. echo !str:~0,30!
  24. set "_str=!str:~30!"
  25. if "!_str!" neq "" (
  26. set "str=!_str!"
  27. goto :1
  28. ) else (
  29. exit /b
  30. )
复制代码

作者: 小白来了    时间: 2023-11-3 12:02

回复 20# 77七


    成功了,大佬威武霸气!感谢您的专业帮助~祝您财源广进~一起顺利!!
作者: qixiaobin0715    时间: 2023-11-3 14:22

本帖最后由 qixiaobin0715 于 2023-11-4 08:22 编辑

感谢14楼指出代码错误。下面代码最多可进行2次换行,即适合一行不超过90个字符,原字幕文件空行保留:
  1. @echo off
  2. chcp 65001>nul
  3. for /f "delims=" %%i in ('dir /b /a-d *.srt') do (
  4.     (for /f "delims=" %%j in ('type "%%i"') do (
  5.         set "str=%%j"
  6.         setlocal enabledelayedexpansion
  7.         set /a t=str
  8.         if !t! equ !str! (
  9.             echo,%%j
  10.         ) else if not "!str:-->=!"=="!str!" (
  11.             echo,%%j
  12.         ) else (
  13.             if not "!str:~30!"=="" (
  14.                 echo,!str:~,30!
  15.                 set str=!str:~30!
  16.                 if not "!str:~30!"=="" (
  17.                     echo,!str:~,30!
  18.                     echo,!str:~30!
  19.                     echo,
  20.                 ) else (
  21.                     echo,!str!
  22.                     echo,
  23.                 )
  24.             ) else (
  25.                 echo,%%j
  26.                 echo,
  27.             )
  28.         )
  29.         endlocal
  30.     ))>"New-%%i"
  31. )
复制代码

作者: terse    时间: 2023-11-4 12:26

powershell
  1. <# :
  2. @echo off
  3. powershell -noprofile -NoLogo "iex (${%~f0} | out-string)"
  4. pause
  5. exit
  6. #>
  7. $re = "^\d{2}:\d{2}:\d{2},\d{3} --> \d{2}:\d{2}:\d{2},\d{3}$"
  8. $n = 30
  9. [IO.Directory]::EnumerateFiles($pwd, "*.srt")|%{ [IO.File]::WriteAllLines("$_._new.txt",([IO.File]::ReadAllLines($_)|%{if($_ -match $re){$_ }else{$_ -split "(?<=\G.{$n})(?=.)"}}),[Text.Encoding]::UTF8)}
复制代码

作者: 小白来了    时间: 2023-11-20 08:55

回复 20# 77七


    大哥,这段代码改成覆盖原文件,应该怎样修改呢?我自己修改的操作完成空白文件了。求您指教~谢谢!
  1. @echo off
  2. rem 批处理保存为utf-8编码格式
  3. chcp 65001 >nul
  4. for /f "delims=" %%i in ('dir /b /a-d *.srt') do (
  5. (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<"%%i"') do (
  6. if "%%b" equ "" (
  7. echo=
  8. ) else (
  9. set "str=%%b"
  10. setlocal enabledelayedexpansion
  11. set "_str=!str:~0,1!"
  12. if !_str! gtr Z (
  13. call :1
  14. ) else (
  15. echo !str!
  16. )
  17. endlocal
  18. )
  19. ))>"%%~ni_2%%~xi"
  20. )
  21. pause & exit
  22. :1
  23. echo !str:~0,30!
  24. set "_str=!str:~30!"
  25. if "!_str!" neq "" (
  26. set "str=!_str!"
  27. goto :1
  28. ) else (
  29. exit /b
  30. )
复制代码

作者: 77七    时间: 2023-11-20 11:01

回复 24# 小白来了


   19行下面添加一行
  1.         move "%%~ni_2%%~xi" "%%i"
复制代码





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