2010-12-10 26 views
1

J'ai un gros fichier texte (environ 10 Mo). Dans le fichier texte, il y a des valeurs telles que (sans les lignes vides entre les lignes, je ne pouvais pas formater ici correctement):NSScanner vs componentsSeparatedByString

;string1;stringValue1; 

;string2;stringValue2; 

;string3;stringValue3; 

;string4;stringValue4; 

J'analyse toutes les valeurs du « stringX » à un tableau et le ' stringValueX » à une autre chaîne, en utilisant une solution assez laid:

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

J'ai essayé de le faire en utilisant NSScanner en suivant cet exemple: http://www.macresearch.org/cocoa-scientists-part-xxvi-parsing-csv-data

Mais je reçu des avertissements de mémoire puis tout écrasé.

Dois-je le faire en utilisant NSScanner et si oui, quelqu'un peut-il me donner un exemple de la façon de faire cela?

Merci!

+0

C'est beaucoup de choses à stocker dans la RAM sur un appareil mobile! Le code que vous avez omis serait également intéressant. Vous pouvez vérifier votre consommation de mémoire avec Instruments. – Eiko

Répondre

0

Dans la plupart des cas NSScanner est mieux adapté que componentsSeparatedByString:, surtout si vous essayez de préserver la mémoire.

Votre fichier peut être analysé par une boucle comme ceci:

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 
} 

Vous devez probablement ajouter un code de contrôle d'erreur à ce que vous obtenez dans le cas où un fichier non valide.

+0

Merci Sven! Je vais essayer ça immédiatement! – Mikael

+0

Cela fonctionne très bien! Et c'est beaucoup plus agréable que le componentSeparatedByString:. Je pense que c'est un peu plus lent, mais je pense que c'est plus robuste. – Mikael

+0

Pensez-vous que c'est plus lent ou l'avez-vous mesuré? – Sven

0

Vous devriez utiliser l'énumération rapide. C'est beaucoup mieux que celui utilisant objectEnumerator. Essayez cette

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

ah, merci pour le conseil :) – Mikael