看了《老友记》,很喜欢,所以去找字幕,结果只是找到了中文的srt字幕,还有smi格式的英文字幕,打开一看,差不多的格式,很容易读懂,所以花了几天时间,用vba写了一个转换的东西,老爱好,还是在excel中,不需要安装vb6,不需要安装vs2005,绿色的,^_^
运行过了,在winxp下excel2003下通过。
作者:kiseigo 日期:2003.03.30
Option Explicit
'此过程实现smi字幕转换成srt字幕
Sub ConvertSMItoSRT()
Call
SMItoSRT("D:\FriendsS01E01.smi", "D:\FriendsS01E01.srt")
End Sub
'转换smi文本成为srt文本 2009.04.03 修改
'pathSMI: 输入的路径,smi文件的完整路径,比如 "D:\FriendsS01E02.smi"
'pathSRT: 输出路径,srt文件的完整路径(如果不存在就新建,如果已经存在就删除,然后再新建),比如
"D:\FriendsS01E02.srt"
Private Sub SMItoSRT(pathSMI As String, pathSRT As String)
'SMI的格式如下:
'<SYNC Start=1601><P
Class=ENCC>
'The One Where It All Began (Pilot)
'<SYNC Start=5059><P
Class=ENCC>
'<SYNC Start=55422><P
Class=ENCC>
'There 's nothing to tell.<br>
'It 's just some guy I work with.
'<SYNC Start=59256><P
Class=ENCC>
'srt的格式如下:
'1
'00:00:55,422 --> 00:00:59,256
'没什么好说的!
'他不过是我的同事!
'
'2
'00:00:59,459 --> 00:01:01,586
'少来了,你和那个人一起出去!
'
步骤1:读取数据到LinesSource()中,为了防止出意外,先不分析数据
Dim
fileContents As String
Dim
LinesSource() As String
Dim nfSMI As
Integer
nfSMI =
FreeFile
Open pathSMI
For Binary As #nfSMI
fileContents = Space(LOF(nfSMI))
Get #nfSMI, , fileContents
Close
nfSMI
LinesSource
= Split(fileContents, vbCrLf)
'步骤2:对数据LinesSource()进行初步分析,得到TimeContent(),暂时不保存
Dim data()
As TimeContent
ReDim
Preserve data(100) '一次显示的字幕最多5行了
Dim nParag
As Integer '第几段,从0开始
Dim nTmp01
As Integer '临时变量01
Dim nTmp02
As Integer
Dim
nIndexTmp As Integer '本段落的第几行字幕,从0开始
Dim
blnGetTheEndOfParag As Boolean '=ture, 找到了此段落的终点. = false,
没有找到终点
blnGetTheEndOfParag = True
Dim i As
Integer
Dim j As
Integer
Dim k As
Integer
For i = 0 To
UBound(LinesSource)
LinesSource(i) = Replace(LinesSource(i),
"<br>", "")
If UBound(data) <= nParag Then
ReDim Preserve data((UBound(data) + 100))
End If
'找起点
If blnGetTheEndOfParag = True And Left$(LinesSource(i), 5) =
"<SYNC" And Right$(LinesSource(i), 5) =
"ENCC>" Then
data(nParag).nBegin = i
nTmp01 = InStr(LinesSource(i), "Start=") + 6
nTmp02 = InStr(LinesSource(i), "><P")
- nTmp01
If nTmp02 >= 1 Then
data(nParag).nTimeBegin = Mid$(LinesSource(i), nTmp01, nTmp02)
'找到了此次字幕的开始时间
End If
blnGetTheEndOfParag = False
End If
'找终点