标题: [文本处理] 怎么用批处理合并中、英字幕为中英双字幕文件? [打印本页]
作者: mac007cn 时间: 2011-2-15 15:52 标题: 怎么用批处理合并中、英字幕为中英双字幕文件?
怎么用批处理合并中、英字幕为中英双字幕文件?
我喜欢看中英双字幕的欧美大片,但很多高清影片的外挂字幕都是英、中分开的,如何用批处理把中文字幕chs.srt和英文字幕eng.srt合并成一个chseng.srt字幕呢?中上英下。
谢谢。
如图所示
作者: mac007cn 时间: 2011-2-15 15:59 标题: 我自己想的一个办法
我自己想的一个办法,有点笨,一个大缺点是需要生产(字幕总条数×2)个临时文件。抛砖引玉,求更好的方法。谢谢。- @echo off
- setlocal EnableExtensions
- setlocal EnableDelayedExpansion
-
- REM 功能:合并中、英字幕为中英双字幕
-
- REM 先把原中、英字幕分别分解成N(字幕总条数)个临时文件
- set /a n=1
- for /f "delims=" %%a in (eng.srt) do (
- if "%%a"=="!n!" (
- set /a nPrv=n, n+=1
- echo !nPrv!>engtemp!nPrv!.txt
- ) else (
- echo %%a>>engtemp!nPrv!.txt
- )
- )
-
- set /a n=1
- for /f "delims=" %%a in (chs.srt) do (
- if "%%a"=="!n!" (
- set /a nPrv=n, n+=1
- echo !nPrv!>chstemp!nPrv!.txt
- ) else (
- echo %%a>>chstemp!nPrv!.txt
- )
- )
-
- REM 把中英字幕合并输出
- set /a n-=1
- (
- for /l %%a in (1,1,%n%) do (
- for /f "delims=" %%b in (chstemp%%a.txt) do echo %%b
- for /f "skip=2 delims=" %%c in (engtemp%%a.txt) do echo %%c
- echo.
- )
- )>chseng.srt
- del /q /f chstemp*.txt
- del /q /f engtemp*.txt
- pause
复制代码
[ 本帖最后由 mac007cn 于 2011-2-15 16:03 编辑 ]
作者: HLS 时间: 2011-2-15 16:39
- @echo off
- setlocal enabledelayedexpansion
- set s=0
- for /f "tokens=* delims=" %%t in (chs.srt) do (
- set /a s+=1
- set /a ss=!s!%%3+1
- set /a sss=!s!-1
- echo %%t>>chseng.srt
- call set a=0
- if !ss!==1 for /f "tokens=* delims=" %%r in (eng.srt) do (
- set /a a+=1
- if !a!==!s! echo %%r>>chseng.srt
- if !a!==!s! echo. >>chseng.srt
- )
- )
- pause
复制代码
速度可能不咋地
作者: CrLf 时间: 2011-2-15 16:48
多文件同时输出一直是个棘手的问题...我所知道的纯P的方案代价都不小- @echo off&setlocal enabledelayedexpansion
- for %%z in (chs eng) do (
- set /a test=1,段=0
- for /f "delims=" %%a in (%%z) do (
- if "%%a"=="!test!" (set /a "段+=1","test=段+1") else (
- for %%i in (%%z!段!) do set %%i=!%%i!灬%%a
- )
- )
- )
- (for /l %%a in (1 1 !段!) do for /f "tokens=1* delims=灬" %%b in ('echo !chs%%a!^&echo !eng%%a!') do (
- if defined chs (
- set chs=
- echo %%c
- echo;
- ) else (
- echo %%a
- echo %%b
- set chs=1&set tmp=%%c
- for %%h in ("!tmp:灬=" "!") do echo %%~h
- )
- ))>chseng
- pause
复制代码
作者: CrLf 时间: 2011-2-15 17:16
唔,好像没必要全设为变量,可以分开做...- @echo off&setlocal enabledelayedexpansion>nul 3>chseng.txt
- set /a test=1,段=0
- for /f "delims=" %%a in (eng) do (
- if "%%a"=="!test!" (set /a "段+=1","test=段+1") else (
- for %%i in (eng!段!) do set %%i=!%%i!灬%%a
- )
- )
- set /a tmp=段,test=1,段=0
- echo 1
- for /f "delims=" %%a in (chs) do (
- if "%%a"=="!test!" (set /a "段+=1","test=段+1","e=段-1") else echo %%a
- if "%%a"=="!段!" for %%z in (!e!) do for /f "tokens=1-3 delims=灬" %%b in ("!eng%%z!") do (
- echo;%%c
- echo;%%d
- echo %%a
- ))
- for %%z in (!tmp!) do for /f "tokens=1-3 delims=灬" %%b in ("!eng%%z!") do (
- echo;%%c
- echo;%%d
- echo;
- )
复制代码
算法不好,有点打补丁的意思
作者: netbenton 时间: 2011-2-15 19:25
- @echo off&setlocal enabledelayedexpansion
- set num=1
-
- for /f "delims=" %%a in (chs) do (
- if "%%a"=="!num!" (set L!num!=!str!&set str=&set/a num+=1) else (
-
- rem 处理有多行字幕的情况,加入双引号整理
- if defined str (set str=!str! "%%a") else (
- rem 加入对str 变量的判断是为了丢弃 时间数据行
- set "str= "
- )
- )
- )
-
- ::最后一个也要存入"数组"中
- set L!num!=!str!
-
- ::显示L(?) "数组"
- ::看到编号比原来的大1了,但是,不用理会,在eng库进行的同样的操作,是可以同步的
- set L
- pause
-
-
- set num=1
-
- ::这里加入了保留空行的 findstr /n 功能
- for /f "tokens=1* delims=:" %%a in ('findstr /n .* eng') do (
- echo;%%b
-
- rem 所有数据都直接显示,仅在条件合适进插入中文的字幕数据
- rem 注意echo后面分号,是为了显示空行的
-
- if "%%b"=="!num!" (set/a num+=1,n=1) else (
- set /a n+=1
- rem 在时间数据行后面
- if !n! equ 2 (
- for %%i in (!num!) do (
- rem 显示中文件数据,注意%%号后面的~,是为了去除双引号的
- for %%j in (!L%%i!) do echo;%%~j
- )
- )
- )
- )
-
-
-
- pause
复制代码
如果要处理文件很大时,全读入变量,处理起来会很慢的,下面的是可以分批读取的,
- @echo off&setlocal enabledelayedexpansion
-
- rem 可以在这个变量设置一次处理多少,可能设为 500~5000 较好
- set 分段=2000
-
- set num=1
- set m=1
- ::这里加入了保留空行的 findstr /n 功能
- for /f "tokens=1* delims=:" %%a in ('findstr /n .* eng') do (
- echo;%%b
- rem 所有数据都直接显示,仅在条件合适进插入中文的字幕数据
- rem 注意echo后面分号,是为了显示空行的
- if "%%b"=="!num!" (set/a num+=1,n=1) else (
- set /a n+=1
- rem 在时间数据行后面
- if !n! equ 2 (
- set /a num1=num-bnum
- rem 分批读取
- if not defined L!num1! call :NextPage
- for %%i in (!num1!) do (
- rem 显示中文件数据,注意%%号后面的~,是为了去除双引号的
- for %%j in (!L%%i!) do echo;%%~j
- )
- )
- )
- )
- pause
- exit/b
-
- :NextPage 分批读取中文数据到变量L(?) 子过程
-
- set/a bnum=%num%-1
- set nv=0
- set str=
- rem 跳过已经读过的数据段
- if defined sk set skip=skip=%sk%
- for /f "%skip% tokens=1* delims=:" %%a in ('findstr /n .* chs') do (
- if "%%b"=="!m!" (
- set L!nv!=!str:""=!
- set str=
- rem 以 N 个作为一批读取
- if !nv! equ !分段! goto :中断
- set/a m+=1,nv+=1
-
- ) else (
- rem 处理有多行字幕的情况,加入双引号整理
- if defined str (set str=!str! "%%b") else (
- rem 加入对str 变量的判断是为了丢弃 时间数据行
- set "str= "
- )
- )
- set/a sk+=1
- )
- ::最后一个也要存入"数组"中
- set L!nv!=!str:""=!
- :中断
- set num1=1
- exit/b
复制代码
[ 本帖最后由 netbenton 于 2011-2-15 20:31 编辑 ]
作者: CrLf 时间: 2011-2-15 20:50
字幕文件能有多大...
作者: lhsbqb 时间: 2011-2-16 17:46 标题: 回复 1楼 的帖子
根据文件结构写的- @echo off
- set /a num=1
-
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in (eng.txt) do (
- set /a num+=1
-
- set /a a=!num!%%4
- set /a b=!num!-2
-
- if !a!==0 (
- call :sub2 !b!
- set /a num+=1
- )
-
- echo %%i>>chseng.txt
-
- if !a!==0 (
- echo. >>chseng.txt
- )
-
- )
-
- :sub1
- goto :eof
-
- :sub2
- for /f "skip=%1 delims=" %%j in (chs.txt) do (
- echo>>chseng.txt %%j
- goto :sub1
- )
- goto :eof
-
- pause
复制代码
作者: lvsehuaxue 时间: 2011-2-16 17:48
- @echo off&setlocal enabledelayedexpansion
- (for /f "delims=" %%i in (chs) do (
- set /a n+=1
- set .!n!=%%i
- )
- for /f "delims=" %%i in (eng) do (
- set /a m+=1
- set /a x=!m!%%3
- echo %%i
- if !x! == 0 call echo %%.!m!%%&echo.
- ))>chseng.str
- pause
复制代码
[ 本帖最后由 lvsehuaxue 于 2011-2-16 18:30 编辑 ]
作者: batman 时间: 2011-2-21 12:00
建议楼主参照此贴:
http://www.bathome.net/viewthrea ... hlight=%BD%BB%CC%E6
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |