【问题标题】:How can I modify this SRT file parser?如何修改此 SRT 文件解析器?
【发布时间】:2020-07-28 05:26:05
【问题描述】:

我在 stackoverflow 上找到了一些用于解析 .srt 文件的好代码(使用 Objective C 解析 SRT 文件),如下所示:

NSScanner *scanner = [NSScanner scannerWithString:[theTextView string]];
while (![scanner isAtEnd])
{
    @autoreleasepool
    {
        NSString *indexString;
        (void) [scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&indexString];

        NSString *startString;
        (void) [scanner scanUpToString:@" --> " intoString:&startString];

        (void) [scanner scanString:@"-->" intoString:NULL];

        NSString *endString;
        (void) [scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&endString];

        NSString *textString;
        (void) [scanner scanUpToString:@"\r\n\r\n" intoString:&textString];
        textString = [textString stringByReplacingOccurrencesOfString:@"\r\n" withString:@" "];
        textString = [textString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

        NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                    indexString, @"index",
                                    startString, @"start",
                                    endString , @"end",
                                    textString , @"text",
                                    nil];

        NSLog(@"%@", dictionary);
    }
}

我有一些来自电视剧的 .srt 文件,其中包含很多“信用”子内容,这有点破坏体验并将它们编码出来,给我留下了像这样的 非顺序 索引:

// deleted subtitles
3
00:00:11,070 --> 00:00:14,466
Screenwriter: Name here...

4
00:00:14,633 --> 00:00:17,466
Music: Name here...

5
00:00:17,686 --> 00:00:20,680
Narrator: Name here...

// deleted subtitle
7
00:01:17,966 --> 00:01:21,966
Episode 12

当我尝试导入文件时,它会阻塞 FCPX。我对 NSScanner 完全陌生,我尝试了所有我能想到的方法,但都没有成功。我将不胜感激修改上述内容以跳过子索引行总共(如果可能的话?)。我可以使用单独的代码按顺序将它们添加回来。谢谢!

更新: 感谢您通过 'while' 循环 skaak 进行索引的建议,但问题似乎仍然违反逻辑,因为它永远不会超过第一遍(!!)。日志如下所示 - 首先使用 NSDictionary 然后附加到 NSMutableString (可能对我的目的更有用)。请注意,在这两种情况下,第一个 sub 都更改为 1,但索引 4、5、7 保持不变,而不是重新编号为 2、3、4。

2020-07-29 18:35:26.267 SRT Editor[12494:903] 
{
    end = "00:00:14,466";
    index = 1;
    start = "00:00:11,070";
    text = "Screenwriter: Hashida Sugako\n\n4 00:00:14,633 --> 00:00:17,466 Music: Sakada Koichi\n\n5 00:00:17,686 --> 00:00:20,680 Narrator: Naraoka Tomoko\n\n7 00:01:28,633 --> 00:01:34,233 It was early spring in 1958...
}

2020-07-29 18:51:15.612 SRT Editor[12646:903] 

1
00:00:11,07000:00:14,466Screenwriter: Hashida Sugako

4 00:00:14,633 --> 00:00:17,466 Music: Sakada Koichi

5 00:00:17,686 --> 00:00:20,680 Narrator: Naraoka Tomoko

7 00:01:28,633 --> 00:01:34,233 It was early spring in 1958...

另一个令人费解的观察是,如果我放入一个 loopCounter++,它还表明“while”循环只通过一次,这让我感到困惑,尽管我确实提到不熟悉 NSScanner。

【问题讨论】:

  • 你真的不需要索引,如果它们是排序的,你可以将它们添加到一个数组中,数组的索引将是对象的索引(+1,因为我猜它不需要'不是从 0 开始)
  • 你打算如何使用字典?
  • 你好威勒克。它包含在代码示例中),如上图所示),但在我的情况下,我倾向于只写一个 NSMutableString。

标签: objective-c macos srt


【解决方案1】:

试试这个

NSUInteger index = 1;

NSScanner *scanner = [NSScanner scannerWithString:[theTextView string]];
while (![scanner isAtEnd])
{
    @autoreleasepool
    {
        NSString *indexString;
        (void) [scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&indexString];

        NSString *startString;
        (void) [scanner scanUpToString:@" --> " intoString:&startString];

        (void) [scanner scanString:@"-->" intoString:NULL];

        NSString *endString;
        (void) [scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&endString];

        NSString *textString;
        (void) [scanner scanUpToString:@"\r\n\r\n" intoString:&textString];
        textString = [textString stringByReplacingOccurrencesOfString:@"\r\n" withString:@" "];
        textString = [textString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

        NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                    // Use my own incremental index
                                    @( index ), @"index",
                                    startString, @"start",
                                    endString , @"end",
                                    textString , @"text",
                                    nil];

        NSLog(@"%@", dictionary);

        // Move to next index
        index ++;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2018-12-06
    相关资源
    最近更新 更多