2013-01-11 9 views
5
esempio

Testo:analisi del file SRT con Objective C

1 
00:00:00,000 --> 00:00:01,000 
This is the first 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 

In JavaScript vorrei analizzare questo con un'espressione regolare certamente. Mi sto solo chiedendo, è il modo migliore per farlo in Obj C? Sono sicuro che ho potuto trovare un modo per farlo, ma sto cercando di farlo in modo appropriato.

ho solo bisogno di sapere da dove iniziare e sono felice di fare il resto, ma per capire bene che sto andando a finire con qualcosa di simile (pseudo codice):

NSDictionary 
index -> [0-9]+ 
start -> hh:mm:ss,mmm 
end -> hh:mm:ss,mmm 
text -> one of the lines of text 

In In questo caso, analizzerei tre voci nel mio dizionario.

+1

In miglior modo si intende efficienti o di facile fattibile? –

+0

Io vado dalla parte dell'efficiente, ma prendo tutto il mio aiuto e riesco a metterlo insieme nel modo che vedo meglio. – Jacksonkr

+0

Ok, è abbastanza chiaro, l'unica cosa che non capisco è cosa intendi per "mmm", sono questi millisecondi? –

risposta

11

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ì.

+0

Ho intenzione di realizzare un'implementazione molto vicina alla tua quindi immagino che ti darò il punto e metto la mia soluzione personale in una modifica alle mie domande. Grazie per l'aiuto! – Jacksonkr

+0

Prego! – trudyscousin

+0

Grazie, mi è stato molto utile, ma ho notato che c'è un problema nei testi con più di una riga. In tal caso l'analisi è interrotta. –

0

Il mio suggerimento è di utilizzare un NSDateFormatter per analizzare la seconda riga. Vorrei dividere quella stringa in due stringhe (vedi componentsSeparatedByString: in NSString class reference). Questo mentre si legge la riga del file per riga.

Così il ciclo sarebbe:

  • Se il file contiene nuovamente i dati, leggere la riga successiva;
  • Se la riga successiva è un multiplo di 4, allocare un nuovo oggetto.Questo oggetto dovrebbe essere in grado di contenere due date, un intero e una stringa;
  • Se la riga successiva non è un multiplo di 4, leggere la riga e assegnarne il valore al campo corrispondente.