- @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 编辑 ] |