Как превратить файл SRT в набор данных?

Можно ли повернуть SRT файл, который используется для субтитров в видео в наборе данных?

При импорте в Excel SRT Формат файла выглядит так:

1
00:00:03,000 --> 00:00:04,000
OVERLAPS PURE COINCIDENCE THAT

...

Этот паттерн продолжается как время в "видео" / расшифровке стенограммы. Я хотел бы отформатировать SRT подать файл таким образом:

number ; start ; end ; text

1 ; 00:00:03,000 ; 00:00:04,000 ; OVERLAPS PURE COINCIDENCE THAT

3 ответа

Решение

Процедура VBA ниже загружает стандарт .srt (SubRip Movie Subtitle File) из локального файла и разбивает его на строки / столбцы активной рабочей таблицы Excel.

Импорт субтитров SRT из локального файла:

Sub importSRTfromFile(fName As String)
'Loads SRT from local file and converts to columns in Active Worksheet

    Dim sIn As String, sOut As String, sArr() As String, x As Long

    'load file
    Open fName For Input As #1
        While Not EOF(1)
            Line Input #1, sIn
            sOut = sOut & sIn & vbLf
        Wend
    Close #1

    'convert LFs to delimiters & split into array
    sOut = Replace(sOut, vbLf & vbLf, vbCr)
    sOut = Replace(Replace(sOut, vbLf, "|"), " --> ", "|")
    sArr = Split(sOut, vbCr)

    'check if activesheet is blank
    If ActiveSheet.UsedRange.Cells.Count > 1 Then
        If MsgBox(UBound(sArr) & " rows found." & vbLf & vbLf & _
            "Okay to clear worksheet '" & ActiveSheet.Name & "'?", _
            vbOKCancel, "Delete Existing Data?") <> vbOK Then Exit Sub
        ActiveSheet.Cells.ClearContents
    End If

    'breakout into rows
    For x = 1 To UBound(sArr)
        Range("A" & x) = sArr(x)
    Next x

    'split into columns
    Columns("A:A").TextToColumns Destination:=Range("A1"), _
        DataType:=xlDelimited, Other:=True, OtherChar:="|"

    MsgBox "Imported " & UBound(sArr) & " rows from:" & vbLf & fName

End Sub

Пример использования:

Sub test_FileImport()
    importSRTfromFile "c:\yourPath\yourFilename.srt"
End Sub

Импортируйте SRT-субтитры из URL сайта:

Кроме того, вы можете импортировать .srt (или другие подобные текстовые файлы) с URL-адреса веб- сайта, такого как http://subtitle-index.org/ с этим:

Sub importSRTfromWeb(url As String)
'Loads SRT from URL and converts to columns in Active Worksheet

    Dim sIn As String, sOut As String, sArr() As String, rw As Long
    Dim httpData() As Byte, XMLHTTP As Object

    'load file from URL
    Set XMLHTTP = CreateObject("MSXML2.XMLHTTP")
    XMLHTTP.Open "GET", url, False
    XMLHTTP.send
    httpData = XMLHTTP.responseBody
    Set XMLHTTP = Nothing
    sOut = StrConv(httpData, vbUnicode)

    'convert LFs to delimiters & split into array
    sOut = Replace(sOut, vbLf & vbLf, vbCr)
    sOut = Replace(Replace(sOut, vbLf, "|"), " --> ", "|")
    sArr = Split(sOut, vbCr)

    'check if activesheet is blank
    If ActiveSheet.UsedRange.Cells.Count > 1 Then
        If MsgBox(UBound(sArr) & " rows found." & vbLf & vbLf & _
            "Okay to clear worksheet '" & ActiveSheet.Name & "'?", _
            vbOKCancel, "Delete Existing Data?") <> vbOK Then Exit Sub
        ActiveSheet.Cells.ClearContents
    End If

    'breakout into rows
    For rw = 1 To UBound(sArr)
        Range("A" & rw) = sArr(rw)
    Next rw

    'split into columns
    Columns("A:A").TextToColumns Destination:=Range("A1"), _
        DataType:=xlDelimited, Other:=True, OtherChar:="|"
    MsgBox "Imported " & UBound(sArr) & " rows from:" & vbLf & url

End Sub

Пример использования:

Sub testImport()
    importSRTfromWeb _
        "https://subtitle-index.org/download/4670541854528212663953859964/SRT/Pulp+Fiction"
End Sub

Многие сайты размещаются бесплатно .srt"S; вам, возможно, придется щелкнуть правой кнопкой мыши кнопку загрузки, чтобы скопировать ссылку (которая может иметь .srt расширение или может быть указателем, как в примере выше). Процедура не будет работать на .zipФайлы


Дополнительная информация:

В приведенном выше коде:

'breakout into rows For rw = 1 To UBound(sArr) Range("A" & rw) = sArr(rw) Next rw

следует заменить на:

'breakout into rows For rw = 0 To UBound(sArr) Range("A" & rw+1) = sArr(rw) Next rw

иначе вывод начнется со строки 2

Я использовал Vim и написал быстрое регулярное выражение для преобразования файла .srt в файл .csv для друга-переводчика, которому нужно было подобное преобразование. Затем файл csv можно открыть в Excel/LibreOffice и сохранить как .xls, .ods или что-то еще. Моему другу не нужно было, чтобы номера субтитров отображались в первом столбце, поэтому код регулярного выражения выглядит так:

      set fileencoding=utf-8
%s/"/""/g
g/^\d\+$/d
%s@^\(.*\) --> \(.*\)\n@"\1","\2","@g
%s/\n^$/"/g

Вариант сохранения поднумерации:

      set fileencoding=utf-8
%s/"/""/g
%s@\(^\d\+\)$\n^\(.*\) --> \(.*\)\n@"\1","\2","\3","@g
%s/\n^$/"/g

Сохраните этот код в текстовый файл с .vimрасширение, затем используйте этот файл при редактировании вашего .srt в Vim / Gvim. Сохраните результат в формате .csv. Наслаждайтесь магией регулярных выражений!

NB: мой код использует запятые в качестве разделителей полей. Измените запятые на точки с запятой в приведенном выше коде, чтобы использовать точки с запятой. Я также добавил двойные кавычки в качестве разделителей строк на случай, если в тексте субтитров встречаются двойные кавычки и запятые. Гораздо больше доказательств ошибок!

Другие вопросы по тегам