标题: [文本处理] 批处理如何检测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文件传网盘了,您抽时间给看下吧~
就是把每一行文字比较长的根据设定的字数换行~- 链接:https://pan.baidu.com/s/1-xmRDW2-5L3JQB6YBOtsvg?pwd=0ydb
- 提取码:0ydb
复制代码
作者: qixiaobin0715 时间: 2023-11-2 15:22
- @echo off
- chcp 65001>nul
- for /f "delims=" %%i in ('dir /b /a-d *.srt') do (
- (for /f "delims=" %%j in ('type "%%i") do (
- set "str=%%j"
- setlocal enabledelayedexpansion
- if not "!str:~30!"=="" (
- echo,!str:~,30!
- echo,!str:~30!
- ) else (
- echo,%%j
- )
- endlocal
- ))>"New-%%i"
- )
复制代码
作者: 小白来了 时间: 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楼代码第四行- (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文件)- @echo off&chcp 936
-
- set changdu=30
-
- for %%a in (*.srt) do (
- cd.>"new_%%~na.newnew"
- set "newfile=new_%%~na.newnew"
- for /f "delims=" %%b in ('findstr /n .* "%%a"') do (
- set line=%%b
- setlocal enabledelayedexpansion
- set line=!line:*:=!
- if not defined line (
- rem echo,>>"!newfile!"
- echo,>>"!newfile!"
- ) else if "!line:~%changdu%!" == "" (
- rem echo,!line:*:=!>>"!newfile!"
- echo,!line!>>"!newfile!"
- ) else (
- set n=0
- set /a m=%changdu%
- rem set line=!line:*:=!
- call :aaa
- )
- endlocal
- )
- )
- rename *.newnew *.srt
- del *.newnew 2>nul
- echo done&pause&exit/b
-
- :aaa
- echo,!line:~%n%,%changdu%!>>"!newfile!"
- set /a n+=%changdu%
- set /a m+=%changdu%
- if "!line:~%m%!" neq "" (goto :aaa) else (
- if "!line:~%n%!" neq "" echo,!line:~%n%!>>"!newfile!"
- )
复制代码
作者: 77七 时间: 2023-11-2 21:34
- @echo off
- rem 批处理保存为utf-8编码格式
- chcp 65001 >nul
- for /f "delims=" %%i in ('dir /b /a-d *.srt') do (
- (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<"%%i"') do (
- if "%%b" equ "" (
- echo=
- ) else (
- set "str=%%b"
- setlocal enabledelayedexpansion
- call :1
- endlocal
- )
- ))>"%%~ni_2%%~xi"
- )
- pause & exit
-
- :1
- echo !str:~0,30!
- set "_str=!str:~30!"
- if "!_str!" neq "" (
- set "str=!_str!"
- goto :1
- ) else (
- exit /b
- )
复制代码
作者: 小白来了 时间: 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# 小白来了
- @echo off
- rem 批处理保存为utf-8编码格式
- chcp 65001 >nul
- for /f "delims=" %%i in ('dir /b /a-d *.srt') do (
- (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<"%%i"') do (
- if "%%b" equ "" (
- echo=
- ) else (
- set "str=%%b"
- setlocal enabledelayedexpansion
- set "_str=!str:~0,1!"
- if !_str! gtr Z (
- call :1
- ) else (
- echo !str!
- )
- endlocal
- )
- ))>"%%~ni_2%%~xi"
- )
- pause & exit
-
- :1
- echo !str:~0,30!
- set "_str=!str:~30!"
- if "!_str!" neq "" (
- set "str=!_str!"
- goto :1
- ) else (
- exit /b
- )
复制代码
作者: 小白来了 时间: 2023-11-3 12:02
回复 20# 77七
成功了,大佬威武霸气!感谢您的专业帮助~祝您财源广进~一起顺利!!
作者: qixiaobin0715 时间: 2023-11-3 14:22
本帖最后由 qixiaobin0715 于 2023-11-4 08:22 编辑
感谢14楼指出代码错误。下面代码最多可进行2次换行,即适合一行不超过90个字符,原字幕文件空行保留:- @echo off
- chcp 65001>nul
- for /f "delims=" %%i in ('dir /b /a-d *.srt') do (
- (for /f "delims=" %%j in ('type "%%i"') do (
- set "str=%%j"
- setlocal enabledelayedexpansion
- set /a t=str
- if !t! equ !str! (
- echo,%%j
- ) else if not "!str:-->=!"=="!str!" (
- echo,%%j
- ) else (
- if not "!str:~30!"=="" (
- echo,!str:~,30!
- set str=!str:~30!
- if not "!str:~30!"=="" (
- echo,!str:~,30!
- echo,!str:~30!
- echo,
- ) else (
- echo,!str!
- echo,
- )
- ) else (
- echo,%%j
- echo,
- )
- )
- endlocal
- ))>"New-%%i"
- )
复制代码
作者: terse 时间: 2023-11-4 12:26
powershell- <# :
- @echo off
- powershell -noprofile -NoLogo "iex (${%~f0} | out-string)"
- pause
- exit
- #>
- $re = "^\d{2}:\d{2}:\d{2},\d{3} --> \d{2}:\d{2}:\d{2},\d{3}$"
- $n = 30
- [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七
大哥,这段代码改成覆盖原文件,应该怎样修改呢?我自己修改的操作完成空白文件了。求您指教~谢谢!- @echo off
- rem 批处理保存为utf-8编码格式
- chcp 65001 >nul
- for /f "delims=" %%i in ('dir /b /a-d *.srt') do (
- (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<"%%i"') do (
- if "%%b" equ "" (
- echo=
- ) else (
- set "str=%%b"
- setlocal enabledelayedexpansion
- set "_str=!str:~0,1!"
- if !_str! gtr Z (
- call :1
- ) else (
- echo !str!
- )
- endlocal
- )
- ))>"%%~ni_2%%~xi"
- )
- pause & exit
-
- :1
- echo !str:~0,30!
- set "_str=!str:~30!"
- if "!_str!" neq "" (
- set "str=!_str!"
- goto :1
- ) else (
- exit /b
- )
复制代码
作者: 77七 时间: 2023-11-20 11:01
回复 24# 小白来了
19行下面添加一行- move "%%~ni_2%%~xi" "%%i"
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |