标题: [文本处理] 求助批处理修改srt文件内容格式 [打印本页]
作者: 小白来了 时间: 2023-11-21 02:07 标题: 求助批处理修改srt文件内容格式
本帖最后由 小白来了 于 2023-11-21 09:39 编辑
问题1、下面是srt文件格式:
由序号,开始时间,结束时间,文字。组成
1
00:00:00,027 --> 00:00:00,537
首先感谢大佬
2
00:00:00,637 --> 00:00:01,112
万能的大佬帮帮忙
3
00:00:01,212 --> 00:00:01,838
祝您身体健康万事如意干啥啥棒
先把时间码中的逗号改成点“.” 也就是00:00:00.027 --> 00:00:00.537
输出文件夹下任意srt文件为如下格式的txt文件,也就是加上分号“;”
格式为:开始时间;结束时间;序号;文字
示例:
00:00:00.027;00:00:00.537;1;首先感谢大佬
00:00:00.637;00:00:01.112;2;万能的大佬帮帮忙
00:00:01.212;00:00:01.838;3;祝您身体健康万事如意干啥啥棒
万能的大佬好实现吗?提前表示感谢!
问题2、将任意srt文件里面的 序号,开始时间,结束时间,删除掉。只保留文字内容,生成原名的txt文件
结果为:
首先感谢大佬
万能的大佬帮帮忙
祝您身体健康万事如意干啥啥棒
作者: Nsqs 时间: 2023-11-21 05:56
本帖最后由 Nsqs 于 2023-11-21 07:14 编辑
- # 2>nul&cls&powershell -noprofile -executionpolicy bypass "gc '%~0'|out-string|iex"&exit
- function collect($a,$b){
- $s=[System.IO.File]::ReadAllLines($a,[System.Text.Encoding]::Default)|?{$_ -match '\w+'}
- $res=[System.Collections.Generic.stack[string]]@{}
- $fn={
- param($t,$c,$n,$x=1)
- if($n -lt $c){
- $m=$s[$n+1] -split ' --> '
- $res.Push(($m[0],$m[1],$x,$s[$n+2] -join ';'))
- $res.Pop();$fn.Invoke($t,$c,$n+3,$x+1)
- }
- }
- [System.IO.File]::WriteAllLines($b,$fn.Invoke($s,$s.length))
- }
- collect 1.srt 2.srt
复制代码
作者: 小白来了 时间: 2023-11-21 08:17
回复 2# Nsqs
感谢大佬,还需要把时间码中的逗号改成点".",再就是改成获取任意的srt名称的文件,不指定为1.srt。
非常感谢您~辛苦了~
作者: hfxiang 时间: 2023-11-21 08:36
本帖最后由 hfxiang 于 2023-11-21 08:42 编辑
回复 1# 小白来了
用gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )的实现方式如下:- gawk -v"RS=" -v"OFS=;" -v"FS=\r?\n| --> " "{gsub(/,/,\".\");$1=$1;print $2,$3,$1,$4}" 1.str>2.str
复制代码
作者: 小白来了 时间: 2023-11-21 09:06
回复 4# hfxiang
厉害啊大佬!简直太6了!只是文本里面带汉字,能否输出格式为ANSI编码,再就是1.srt能改成任意名称吗?就是不指定名称~
谢谢大佬!太6了!
作者: 小白来了 时间: 2023-11-21 09:41
回复 4# hfxiang
大哥,还有个问题:
问题2、将任意srt文件里面的 序号,开始时间,结束时间,删除掉。只保留文字内容,生成原名的txt文件
结果为:
首先感谢大佬
万能的大佬帮帮忙
祝您身体健康万事如意干啥啥棒
用gawk代码该怎样写呢?
作者: qixiaobin0715 时间: 2023-11-21 13:09
- @echo off
- for /f "delims=" %%i in ('dir /b /a-d *.srt') do (
- setlocal enabledelayedexpansion
- (for /f "delims=" %%j in ('type "%%i"') do (
- set /a n+=1
- set /a m=n%%3
- if !m! equ 1 (
- set "str1=%%j"
- ) else if !m! equ 2 (
- set "str2=%%j"
- set "str2=!str2: --> =;!"
- set "str2=!str2:,=.!"
- ) else (
- echo,%%j>>"New1-%%i"
- echo,!str2!;!str1!;%%j
- )
- ))>"New2-%%i"
- endlocal
- )
- pause
复制代码
作者: 77七 时间: 2023-11-21 13:40
本帖最后由 77七 于 2023-11-21 21:57 编辑
code1
- @echo off
- cd /d "%~dp0"
- for /f "delims=" %%i in ('dir /b /a-d *.srt') do (
- (for /f "useback delims=" %%a in ("%%i") do (
- if not defined m (
- set m=%%a
- ) else (
- for /f "tokens=1-3" %%o in ("%%a") do (
- if "%%p" equ "-->" (
- setlocal enabledelayedexpansion
- set str=%%o;%%q;!m!
- set /p=!str:,=.!<nul
- endlocal
- ) else (
- echo ;%%a
- set m=
- )
- )
- )
- ))>>"%%~ni_2.txt"
- set m=
- )
- pause
复制代码
code2
- @echo off
- cd /d "%~dp0"
- for /f "delims=" %%i in ('dir /b /a-d *.srt') do (
- findstr /vr /c:"^[0-9][0-9]*$" /c:"^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]," "%%i" |findstr . >"%%~ni_3.txt"
- )
- pause
复制代码
作者: hfxiang 时间: 2023-11-21 14:06
回复 5# 小白来了
1.编码会与原文件一致;若要修改,可用文件编码转换工具(具体有很多选择,可看你的习惯都选用)
2.套用for,就处理就能使用通用文件。
作者: hfxiang 时间: 2023-11-21 14:07
回复 6# 小白来了 - gawk -v"RS=" -v"FS=\r?\n" "{print $3}" 1.str>2.str
复制代码
作者: Nsqs 时间: 2023-11-21 14:43
回复 3# 小白来了
看不见文件名,不会自己改是吧?
作者: Five66 时间: 2023-11-21 19:42
有双语或三语的srt不?
作者: 小白来了 时间: 2023-11-21 21:38
本帖最后由 小白来了 于 2023-11-21 21:40 编辑
回复 8# 77七
万能的大佬您好,code1代码里面需要把时间码里面的逗号","改成点"."应该怎样弄呢?
原来的是00:00:00,027 --> 00:00:00,537
想要的是00:00:00.027 --> 00:00:00.537
还有就是输出的txt文件能设置为GB2312简体中文格式吗?谢谢大佬~
作者: 77七 时间: 2023-11-21 21:59
回复 13# 小白来了
没注意,已在8楼修改。编码问题 需要另外处理,参考 批处理把UTF-8(有BOM或无BOM)编码文件转换成ANSI编码
作者: qixiaobin0715 时间: 2023-11-22 09:38
本帖最后由 qixiaobin0715 于 2023-11-22 09:55 编辑
你只是提供文件的片段,其它内容会有干扰,写出的代码有时会出问题,最好能将其中一个源文件上传,以便测试。- @echo off
- for /f "delims=" %%i in ('dir /b /a-d *.srt') do (
- setlocal enabledelayedexpansion
- (for /f "delims=" %%j in ('type "%%i"') do (
- set "str=%%j"
- set /a n=str
- if "!n!"=="%%j" (
- set str1=%%j
- set m=1
- ) else if not "!str:-->=!"=="%%j" (
- set "str2=!str:-->=;!"
- set "str2=!str2: =!"
- set "str2=!str2:,=.!"
- set m=2
- ) else (
- echo,%%j>>"New1-%%i"
- if !m! equ 2 (
- echo,!str2!;!str1!;%%j
- set m=0
- ) else (
- echo,%%j
- )
- )
- ))>"New2-%%i"
- endlocal
- )
- pause
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |