找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 36095|回复: 9

[文本处理] 怎么用批处理合并中、英字幕为中英双字幕文件?

[复制链接]
发表于 2011-2-15 15:52:09 | 显示全部楼层 |阅读模式
怎么用批处理合并中、英字幕为中英双字幕文件?
我喜欢看中英双字幕的欧美大片,但很多高清影片的外挂字幕都是英、中分开的,如何用批处理把中文字幕chs.srt和英文字幕eng.srt合并成一个chseng.srt字幕呢?中上英下。
谢谢。
如图所示
 楼主| 发表于 2011-2-15 15:59:51 | 显示全部楼层

我自己想的一个办法

我自己想的一个办法,有点笨,一个大缺点是需要生产(字幕总条数×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 编辑 ]
发表于 2011-2-15 16:39:53 | 显示全部楼层
  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
复制代码

速度可能不咋地
发表于 2011-2-15 16:48:59 | 显示全部楼层
多文件同时输出一直是个棘手的问题...我所知道的纯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
复制代码
发表于 2011-2-15 17:16:54 | 显示全部楼层
唔,好像没必要全设为变量,可以分开做...
  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. )
复制代码
算法不好,有点打补丁的意思
发表于 2011-2-15 19:25:19 | 显示全部楼层
  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 编辑 ]
发表于 2011-2-15 20:50:49 | 显示全部楼层
字幕文件能有多大...
发表于 2011-2-16 17:46:54 | 显示全部楼层

回复 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.        
  7.         set /a a=!num!%%4
  8.         set /a b=!num!-2

  9.         if !a!==0 (
  10.                 call :sub2 !b!
  11.                 set /a num+=1
  12.         )

  13.         echo %%i>>chseng.txt

  14.         if !a!==0 (
  15.                 echo. >>chseng.txt
  16.         )

  17. )

  18. :sub1
  19. goto :eof

  20. :sub2
  21. for /f "skip=%1 delims=" %%j in (chs.txt) do (
  22. echo>>chseng.txt %%j
  23. goto :sub1
  24. )
  25. goto :eof

  26. pause
复制代码
发表于 2011-2-16 17:48:55 | 显示全部楼层

  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 编辑 ]
发表于 2011-2-21 12:00:43 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 08:29 , Processed in 0.021455 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表