2010-12-10 8 views
1

Ich habe eine große Textdatei (ca. 10 MB). In der Textdatei wie es Werte gibt (ohne Leerzeilen zwischen den Zeilen, konnte ich es hier nicht formatiert richtig):NSScanner vs. componentsSeparatedByString

;string1;stringValue1; 

;string2;stringValue2; 

;string3;stringValue3; 

;string4;stringValue4; 

Ich bin Parsen alle ‚stringX‘ Werte in ein Array und die ' stringValueX‘auf eine andere Zeichenfolge, eine ziemlich hässliche Lösung mit:

words = [rawText componentsSeparatedByString:@";"]; 
    NSEnumerator *word = [words objectEnumerator]; 

    while(tmpWord = [word nextObject]) { 

    if ([tmpWord isEqualToString: @""] || [tmpWord isEqualToString: @"\r\n"] || [tmpWord isEqualToString: @"\n"]) { 
    // NSLog(@"%@*** NOTHING *** ",tmpWord); 

    }else { // here I add tmpWord the arrays... 

ich habe versucht, indem sie diesem Beispiel dies mit NSScanner zu tun: http://www.macresearch.org/cocoa-scientists-part-xxvi-parsing-csv-data

Aber ich erhielt Warnungen Speicher und alles stürzte dann.

Soll ich dies mit NSScanner tun und wenn ja, kann mir jemand ein Beispiel geben, wie man das macht?

Danke!

+0

Das sind viele Sachen, die man im RAM auf einem mobilen Gerät speichern kann! Der Code, den Sie weggelassen haben, wäre ebenfalls interessant. Sie können Ihren Speicherverbrauch mit Instrumenten überprüfen. – Eiko

Antwort

0

In den meisten Fällen NSScanner ist besser geeignet als componentsSeparatedByString:, vor allem, wenn Sie Gedächtnis zu bewahren versuchen.

Ihre Datei konnte durch eine Schleife wie folgt analysiert werden:

while (![scanner isAtEnd]) { 
    NSString *firstPart = @""; 
    NSString *secondPart = @""; 

    [scanner scanString: @";" intoString: NULL]; 
    [scanner scanUpToString: @";" intoString: &firstPart]; 

    [scanner scanString: @";" intoString: NULL]; 
    [scanner scanUpToString: @";" intoString: &secondPart]; 

    [scanner scanString: @";" intoString: NULL]; 

    // TODO: add firstPart and secondPart to your arrays 
} 

Sie wahrscheinlich Fehlerprüfung Code dies für den Fall hinzufügen müssen Sie eine ungültige Datei.

+0

Danke Sven! Ich werde das sofort versuchen! – Mikael

+0

Es funktioniert super! Und es ist viel schöner als die Komponenten SeparatedByString:. Ich denke, es ist ein bisschen langsamer, aber ich denke, es ist robuster. – Mikael

+0

Denkst du nur * es ist langsamer oder hast du * es * gemessen? – Sven

0

Sie sollten schnelle Aufzählung verwenden. Es ist viel besser als das, das objectEnumerator verwendet. Versuchen Sie, diese

for (NSString *word in words) { 
    // do the thing you need 
} 
+0

ah, danke für den Tipp :) – Mikael

Verwandte Themen