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

[文本处理] 求助批处理修改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 07:14 编辑
  1. # 2>nul&cls&powershell -noprofile -executionpolicy bypass "gc '%~0'|out-string|iex"&exit
  2. function collect($a,$b){
  3.     $s=[System.IO.File]::ReadAllLines($a,[System.Text.Encoding]::Default)|?{$_ -match '\w+'}
  4.     $res=[System.Collections.Generic.stack[string]]@{}
  5.     $fn={
  6.         param($t,$c,$n,$x=1)
  7.         if($n -lt $c){
  8.             $m=$s[$n+1] -split ' --> '
  9.             $res.Push(($m[0],$m[1],$x,$s[$n+2] -join ';'))
  10.             $res.Pop();$fn.Invoke($t,$c,$n+3,$x+1)
  11.         }
  12.     }
  13.     [System.IO.File]::WriteAllLines($b,$fn.Invoke($s,$s.length))
  14. }
  15. collect 1.srt 2.srt
复制代码

TOP

回复 2# Nsqs


    感谢大佬,还需要把时间码中的逗号改成点".",再就是改成获取任意的srt名称的文件,不指定为1.srt。
    非常感谢您~辛苦了~

TOP

本帖最后由 hfxiang 于 2023-11-21 08:42 编辑

回复 1# 小白来了
用gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )的实现方式如下:
  1. gawk -v"RS=" -v"OFS=;" -v"FS=\r?\n| --> " "{gsub(/,/,\".\");$1=$1;print $2,$3,$1,$4}" 1.str>2.str
复制代码

TOP

回复 4# hfxiang


    厉害啊大佬!简直太6了!只是文本里面带汉字,能否输出格式为ANSI编码,再就是1.srt能改成任意名称吗?就是不指定名称~

谢谢大佬!太6了!

TOP

回复 4# hfxiang


    大哥,还有个问题:
问题2、将任意srt文件里面的 序号,开始时间,结束时间,删除掉。只保留文字内容,生成原名的txt文件
结果为:
首先感谢大佬
万能的大佬帮帮忙
祝您身体健康万事如意干啥啥棒

用gawk代码该怎样写呢?

TOP

  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /a-d *.srt') do (
  3.     setlocal enabledelayedexpansion
  4.     (for /f "delims=" %%j in ('type "%%i"') do (
  5.         set /a n+=1
  6.         set /a m=n%%3
  7.         if !m! equ 1 (
  8.             set "str1=%%j"
  9.         ) else if !m! equ 2 (
  10.             set "str2=%%j"
  11.             set "str2=!str2: --> =;!"
  12.             set "str2=!str2:,=.!"
  13.         ) else (
  14.             echo,%%j>>"New1-%%i"
  15.             echo,!str2!;!str1!;%%j
  16.         )
  17.     ))>"New2-%%i"
  18.     endlocal
  19. )
  20. pause
复制代码

TOP

本帖最后由 77七 于 2023-11-21 21:57 编辑

code1
  1. @echo off
  2. cd /d "%~dp0"
  3. for /f "delims=" %%i in ('dir /b /a-d *.srt') do (
  4. (for /f "useback delims=" %%a in ("%%i") do (
  5. if not defined m (
  6. set m=%%a
  7. ) else (
  8. for /f "tokens=1-3" %%o in ("%%a") do (
  9. if "%%p" equ "-->" (
  10. setlocal enabledelayedexpansion
  11. set str=%%o;%%q;!m!
  12. set /p=!str:,=.!<nul
  13. endlocal
  14. ) else (
  15. echo ;%%a
  16. set m=
  17. )
  18. )
  19. )
  20. ))>>"%%~ni_2.txt"
  21. set m=
  22. )
  23. pause
复制代码




code2
  1. @echo off
  2. cd /d "%~dp0"
  3. for /f "delims=" %%i in ('dir /b /a-d *.srt') do (
  4.         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"
  5. )
  6. pause
复制代码
bat小白,请多指教!谢谢!

TOP

回复 5# 小白来了

1.编码会与原文件一致;若要修改,可用文件编码转换工具(具体有很多选择,可看你的习惯都选用)
2.套用for,就处理就能使用通用文件。

TOP

回复 6# 小白来了
  1. gawk -v"RS=" -v"FS=\r?\n" "{print $3}" 1.str>2.str
复制代码

TOP

回复 3# 小白来了


    看不见文件名,不会自己改是吧?

TOP

有双语或三语的srt不?

TOP

本帖最后由 小白来了 于 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简体中文格式吗?谢谢大佬~

TOP

回复 13# 小白来了


   没注意,已在8楼修改。编码问题 需要另外处理,参考  批处理把UTF-8(有BOM或无BOM)编码文件转换成ANSI编码
bat小白,请多指教!谢谢!

TOP

本帖最后由 qixiaobin0715 于 2023-11-22 09:55 编辑

你只是提供文件的片段,其它内容会有干扰,写出的代码有时会出问题,最好能将其中一个源文件上传,以便测试。
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /a-d *.srt') do (
  3.     setlocal enabledelayedexpansion
  4.     (for /f "delims=" %%j in ('type "%%i"') do (
  5.         set "str=%%j"
  6.         set /a n=str
  7.         if "!n!"=="%%j" (
  8.             set str1=%%j
  9.             set m=1
  10.         ) else if not "!str:-->=!"=="%%j" (
  11.             set "str2=!str:-->=;!"
  12.             set "str2=!str2: =!"
  13.             set "str2=!str2:,=.!"
  14.             set m=2
  15.         ) else (
  16.             echo,%%j>>"New1-%%i"
  17.             if !m! equ 2 (
  18.                 echo,!str2!;!str1!;%%j
  19.                 set m=0
  20.             ) else (
  21.                 echo,%%j
  22.             )
  23.         )
  24.     ))>"New2-%%i"
  25.     endlocal
  26. )
  27. pause
复制代码

TOP

返回列表