Alcuni background: ho scritto una piccola app e ho creato un file chiamato stuff.srt contenente gli esempi che risiedono nel pacchetto; quindi, i miei mezzi per accedervi.
Questa è solo una cosa rapida e sporca, una prova di concetto. Si noti che non controlla i risultati. Le applicazioni reali controllano sempre i loro risultati. Come puoi vedere, il lavoro si svolge nel metodo -applicationDidFinishLaunching:
(sto lavorando su Mac OS X, non su iOS).
EDIT:
E 'stato sottolineato che il codice come originariamente pubblicato non gestisce correttamente più righe di testo. Per risolvere questo problema, approfitto del fatto che SRT files use CRLF as their line breaks e cerchi due occorrenze di questa sequenza. Quindi cambio tutte le occorrenze di CRLF nella stringa di testo in spazi, in base a ciò che ho osservato here. Questo non tiene conto degli spazi iniziali o finali in ogni riga del testo.
Ho cambiato il contenuto del file stuff.srt a questo:
1
00:00:00,000 --> 00:00:01,000
This is the first line
and it has a secondary line
2
00:00:01,000 --> 00:00:02,000
This is the second line
3
00:00:02,000 --> 00:00:03,000
This is the last line
and it has a secondary line too
e il codice è stato rivisto come segue (ho anche messo tutto in una direttiva @autoreleasepool; ci potrebbe essere un sacco di oggetti autoreleased generati nel corso di analisi del file):!
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"stuff" ofType:@"srt"];
NSString *string = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL];
NSScanner *scanner = [NSScanner scannerWithString:string];
while (![scanner isAtEnd])
{
@autoreleasepool
{
NSString *indexString;
(void) [scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&indexString];
NSString *startString;
(void) [scanner scanUpToString:@" --> " intoString:&startString];
// My string constant doesn't begin with spaces because scanners
// skip spaces and newlines by default.
(void) [scanner scanString:@"-->" intoString:NULL];
NSString *endString;
(void) [scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&endString];
NSString *textString;
// (void) [scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&textString];
// BEGIN EDIT
(void) [scanner scanUpToString:@"\r\n\r\n" intoString:&textString];
textString = [textString stringByReplacingOccurrencesOfString:@"\r\n" withString:@" "];
// Addresses trailing space added if CRLF is on a line by itself at the end of the SRT file
textString = [textString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
// END EDIT
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
indexString, @"index",
startString, @"start",
endString , @"end",
textString , @"text",
nil];
NSLog(@"%@", dictionary);
}
}
}
l'output rivisto è simile al seguente:
2013-02-09 16:10:17.727 SRTFileScan[4846:303] {
end = "00:00:01,000";
index = 1;
start = "00:00:00,000";
text = "This is the first line and it has a secondary line";
}
2013-02-09 16:10:17.729 SRTFileScan[4846:303] {
end = "00:00:02,000";
index = 2;
start = "00:00:01,000";
text = "This is the second line";
}
2013-02-09 16:10:17.730 SRTFileScan[4846:303] {
end = "00:00:03,000";
index = 3;
start = "00:00:02,000";
text = "This is the last line and it has a secondary line too";
}
Un'altra cosa che ho imparato da quello che ho letto oggi: il formato di file SRT è nato in Francia, e la virgola vista nell'input è il separatore decimale usato lì.
In miglior modo si intende efficienti o di facile fattibile? –
Io vado dalla parte dell'efficiente, ma prendo tutto il mio aiuto e riesco a metterlo insieme nel modo che vedo meglio. – Jacksonkr
Ok, è abbastanza chiaro, l'unica cosa che non capisco è cosa intendi per "mmm", sono questi millisecondi? –