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

[文本处理] 批处理如何检测srt每行字数,超出设定字数换行?

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

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

两个文件如下

链接:https://pan.baidu.com/s/1-xmRDW2-5L3JQB6YBOtsvg?pwd=0ydb

回复 24# 小白来了


   19行下面添加一行
  1.         move "%%~ni_2%%~xi" "%%i"
复制代码
bat小白,请多指教!谢谢!

TOP

回复 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. )
复制代码

TOP

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)}
复制代码

TOP

本帖最后由 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. )
复制代码

TOP

回复 20# 77七


    成功了,大佬威武霸气!感谢您的专业帮助~祝您财源广进~一起顺利!!

TOP

回复 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. )
复制代码
bat小白,请多指教!谢谢!

TOP

回复 16# 77七


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

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

时间码格式:00:09:30,401 --> 00:09:30,971

TOP

回复 15# Five66


    感谢大佬!谢谢

TOP

回复 14# buyiyang


    厉害了我的哥!技术专业!谢谢谢谢!

TOP

  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. )
复制代码
bat小白,请多指教!谢谢!

TOP

本帖最后由 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. )
复制代码

TOP

回复 13# 小白来了


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

TOP

回复 12# Batcher


    UTF-8也是生成的空白文件。是因为srt文件格式吗

TOP

回复 10# 小白来了


请参考Q-04把9楼.bat文件保存为UTF-8编码:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表