Board logo

标题: [文本处理] 怎么用批处理合并中、英字幕为中英双字幕文件? [打印本页]

作者: mac007cn    时间: 2011-2-15 15:52     标题: 怎么用批处理合并中、英字幕为中英双字幕文件?

怎么用批处理合并中、英字幕为中英双字幕文件?
我喜欢看中英双字幕的欧美大片,但很多高清影片的外挂字幕都是英、中分开的,如何用批处理把中文字幕chs.srt和英文字幕eng.srt合并成一个chseng.srt字幕呢?中上英下。
谢谢。
如图所示
作者: mac007cn    时间: 2011-2-15 15:59     标题: 我自己想的一个办法

我自己想的一个办法,有点笨,一个大缺点是需要生产(字幕总条数×2)个临时文件。抛砖引玉,求更好的方法。谢谢。
  1. @echo off
  2. setlocal EnableExtensions
  3. setlocal EnableDelayedExpansion
  4. REM 功能:合并中、英字幕为中英双字幕
  5. REM 先把原中、英字幕分别分解成N(字幕总条数)个临时文件
  6. set /a n=1
  7. for /f "delims=" %%a in (eng.srt) do (
  8.         if "%%a"=="!n!" (
  9.                 set /a nPrv=n, n+=1
  10.                 echo !nPrv!>engtemp!nPrv!.txt
  11.         ) else (
  12.                 echo %%a>>engtemp!nPrv!.txt
  13.         )
  14. )
  15. set /a n=1
  16. for /f "delims=" %%a in (chs.srt) do (
  17.         if "%%a"=="!n!" (
  18.                 set /a nPrv=n, n+=1
  19.                 echo !nPrv!>chstemp!nPrv!.txt
  20.         ) else (
  21.                 echo %%a>>chstemp!nPrv!.txt
  22.         )
  23. )
  24. REM 把中英字幕合并输出
  25. set /a n-=1
  26. (
  27. for /l %%a in (1,1,%n%) do (
  28.         for /f "delims=" %%b in (chstemp%%a.txt) do echo %%b
  29.         for /f "skip=2 delims=" %%c in (engtemp%%a.txt) do echo %%c
  30.         echo.
  31. )
  32. )>chseng.srt
  33. del /q /f chstemp*.txt
  34. del /q /f engtemp*.txt
  35. pause
复制代码

[ 本帖最后由 mac007cn 于 2011-2-15 16:03 编辑 ]
作者: HLS    时间: 2011-2-15 16:39

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set s=0
  4. for /f "tokens=* delims=" %%t in (chs.srt) do (
  5. set /a s+=1
  6. set /a ss=!s!%%3+1
  7. set /a sss=!s!-1
  8. echo %%t>>chseng.srt
  9. call set a=0
  10. if !ss!==1 for /f "tokens=* delims=" %%r in (eng.srt) do (
  11. set /a a+=1
  12. if !a!==!s! echo %%r>>chseng.srt
  13. if !a!==!s! echo. >>chseng.srt
  14. )
  15. )
  16. pause
复制代码

速度可能不咋地
作者: CrLf    时间: 2011-2-15 16:48

多文件同时输出一直是个棘手的问题...我所知道的纯P的方案代价都不小
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%z in (chs eng) do (
  3.     set /a test=1,段=0
  4.     for /f "delims=" %%a in (%%z) do (
  5.         if "%%a"=="!test!" (set /a "段+=1","test=段+1") else (
  6.             for %%i in (%%z!段!) do set %%i=!%%i!灬%%a
  7.         )
  8.     )
  9. )
  10. (for /l %%a in (1 1 !段!) do for /f "tokens=1* delims=灬" %%b in ('echo !chs%%a!^&echo !eng%%a!') do (
  11.     if defined chs (
  12.         set chs=
  13.         echo %%c
  14.         echo;
  15.     ) else (
  16.         echo %%a
  17.         echo %%b
  18.         set chs=1&set tmp=%%c
  19.         for %%h in ("!tmp:灬=" "!") do echo %%~h
  20.     )
  21. ))>chseng
  22. pause
复制代码

作者: CrLf    时间: 2011-2-15 17:16

唔,好像没必要全设为变量,可以分开做...
  1. @echo off&setlocal enabledelayedexpansion>nul 3>chseng.txt
  2. set /a test=1,段=0
  3. for /f "delims=" %%a in (eng) do (
  4.     if "%%a"=="!test!" (set /a "段+=1","test=段+1") else (
  5.         for %%i in (eng!段!) do set %%i=!%%i!灬%%a
  6.     )
  7. )
  8. set /a tmp=段,test=1,段=0
  9. echo 1
  10. for /f "delims=" %%a in (chs) do (
  11.     if "%%a"=="!test!" (set /a "段+=1","test=段+1","e=段-1") else echo %%a
  12. if "%%a"=="!段!" for %%z in (!e!) do for /f "tokens=1-3 delims=灬" %%b in ("!eng%%z!") do (
  13. echo;%%c
  14. echo;%%d
  15. echo %%a
  16. ))
  17. for %%z in (!tmp!) do for /f "tokens=1-3 delims=灬" %%b in ("!eng%%z!") do (
  18. echo;%%c
  19. echo;%%d
  20. echo;
  21. )
复制代码
算法不好,有点打补丁的意思
作者: netbenton    时间: 2011-2-15 19:25

  1. @echo off&setlocal enabledelayedexpansion
  2. set num=1
  3. for /f "delims=" %%a in (chs) do (
  4.     if "%%a"=="!num!" (set L!num!=!str!&set str=&set/a num+=1) else (
  5.         rem 处理有多行字幕的情况,加入双引号整理
  6.         if defined str (set str=!str! "%%a") else (
  7.                 rem 加入对str 变量的判断是为了丢弃 时间数据行
  8.                 set "str= "
  9.         )
  10.     )
  11. )
  12. ::最后一个也要存入"数组"中
  13. set L!num!=!str!
  14. ::显示L(?) "数组"
  15. ::看到编号比原来的大1了,但是,不用理会,在eng库进行的同样的操作,是可以同步的
  16. set L
  17. pause
  18. set num=1
  19. ::这里加入了保留空行的 findstr /n 功能
  20. for /f "tokens=1* delims=:" %%a in ('findstr /n .* eng') do (
  21.     echo;%%b
  22. rem 所有数据都直接显示,仅在条件合适进插入中文的字幕数据
  23. rem 注意echo后面分号,是为了显示空行的
  24.     if "%%b"=="!num!" (set/a num+=1,n=1) else (
  25.         set /a n+=1
  26.         rem 在时间数据行后面
  27.         if !n! equ 2 (
  28.                 for %%i in (!num!) do (
  29.                         rem 显示中文件数据,注意%%号后面的~,是为了去除双引号的
  30.                         for %%j in (!L%%i!) do echo;%%~j
  31.                 )
  32.         )
  33.     )
  34. )
  35. pause
复制代码




如果要处理文件很大时,全读入变量,处理起来会很慢的,下面的是可以分批读取的,

  1. @echo off&setlocal enabledelayedexpansion
  2. rem 可以在这个变量设置一次处理多少,可能设为 500~5000 较好
  3. set 分段=2000
  4. set num=1
  5. set m=1
  6. ::这里加入了保留空行的 findstr /n 功能
  7. for /f "tokens=1* delims=:" %%a in ('findstr /n .* eng') do (
  8.     echo;%%b
  9. rem 所有数据都直接显示,仅在条件合适进插入中文的字幕数据
  10. rem 注意echo后面分号,是为了显示空行的
  11.     if "%%b"=="!num!" (set/a num+=1,n=1) else (
  12. set /a n+=1
  13. rem 在时间数据行后面
  14. if !n! equ 2 (
  15.   set /a num1=num-bnum
  16.   rem 分批读取
  17.   if not defined L!num1! call :NextPage
  18.   for %%i in (!num1!) do (
  19.    rem 显示中文件数据,注意%%号后面的~,是为了去除双引号的
  20.    for %%j in (!L%%i!) do echo;%%~j
  21.   )
  22. )
  23.     )
  24. )
  25. pause
  26. exit/b
  27. :NextPage   分批读取中文数据到变量L(?)  子过程
  28. set/a bnum=%num%-1
  29. set nv=0
  30. set str=
  31. rem 跳过已经读过的数据段
  32. if defined sk set skip=skip=%sk%
  33. for /f "%skip% tokens=1* delims=:" %%a in ('findstr /n .* chs') do (
  34.     if "%%b"=="!m!" (
  35. set L!nv!=!str:""=!
  36. set str=
  37. rem 以 N 个作为一批读取
  38. if !nv! equ !分段! goto :中断
  39. set/a m+=1,nv+=1
  40.     ) else (
  41. rem 处理有多行字幕的情况,加入双引号整理
  42. if defined str (set str=!str! "%%b") else (
  43.   rem 加入对str 变量的判断是为了丢弃 时间数据行
  44.   set "str= "
  45. )
  46.     )
  47.     set/a sk+=1
  48. )
  49. ::最后一个也要存入"数组"中
  50. set L!nv!=!str:""=!
  51. :中断
  52. set num1=1
  53. exit/b
复制代码

[ 本帖最后由 netbenton 于 2011-2-15 20:31 编辑 ]
作者: CrLf    时间: 2011-2-15 20:50

字幕文件能有多大...
作者: lhsbqb    时间: 2011-2-16 17:46     标题: 回复 1楼 的帖子

根据文件结构写的
  1. @echo off
  2. set /a num=1
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%i in (eng.txt) do (
  5. set /a num+=1
  6. set /a a=!num!%%4
  7. set /a b=!num!-2
  8. if !a!==0 (
  9. call :sub2 !b!
  10. set /a num+=1
  11. )
  12. echo %%i>>chseng.txt
  13. if !a!==0 (
  14. echo. >>chseng.txt
  15. )
  16. )
  17. :sub1
  18. goto :eof
  19. :sub2
  20. for /f "skip=%1 delims=" %%j in (chs.txt) do (
  21. echo>>chseng.txt %%j
  22. goto :sub1
  23. )
  24. goto :eof
  25. pause
复制代码

作者: lvsehuaxue    时间: 2011-2-16 17:48

  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%i in (chs) do (
  3.     set /a n+=1
  4.     set .!n!=%%i
  5. )
  6. for /f "delims=" %%i in (eng) do (
  7.     set /a m+=1
  8.     set /a x=!m!%%3
  9.     echo %%i
  10.     if !x! == 0 call echo %%.!m!%%&echo.
  11. ))>chseng.str
  12. pause
复制代码

[ 本帖最后由 lvsehuaxue 于 2011-2-16 18:30 编辑 ]
作者: batman    时间: 2011-2-21 12:00

建议楼主参照此贴:
http://www.bathome.net/viewthrea ... hlight=%BD%BB%CC%E6




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