2010-12-10 7 views
1

大きなテキストファイル(約10 MB)があります。NSScannerとcomponentsSeparatedByString

;string1;stringValue1; 

;string2;stringValue2; 

;string3;stringValue3; 

;string4;stringValue4; 

私は配列にすべての「stringX」の値を解析すると 'だ:テキストファイルのような値は、(行の間の空行せずに、私は適切にここでそれをフォーマットすることができませんでした)がありますかなり醜いソリューションを使用して別の文字列にstringValueXは」:

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

私はこの次の例でNSScannerを使用してこれを実行しようとしました:http://www.macresearch.org/cocoa-scientists-part-xxvi-parsing-csv-data

しかし、私は、メモリの警告を受け、その後、それがすべて墜落しました。

NSScannerを使用してこれを行う必要がありますか?その場合、どのようにすればよいでしょうか?

ありがとうございます!

+0

これはモバイルデバイスのRAMに保存するのに大変な作業です!あなたが省略したコードも興味深いでしょう。インストゥルメントでメモリ消費量を確認できます。 – Eiko

答えて

0

を試してみてください。

あなたのファイルは、このようなループで解析することができます

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 
} 

あなたはおそらく、あなたは無効なファイルを取得する場合にはこれにエラーチェックコードを追加する必要があります。

+0

ありがとうSven!私はすぐにこれを試してみましょう! – Mikael

+0

素晴らしいです!それはcomponentsSeparatedByStringよりはるかにいいです:。私はそれは少し遅いと思うが、私はそれがより堅牢だと思う。 – Mikael

+0

あなたはちょっと*思っていますか?遅くなったのですか、それとも測定しましたか? – Sven

0

高速列挙を使用する必要があります。それはobjectEnumeratorを使用したものよりはるかに優れています。 NSScannerは、あなたがメモリを維持しようとしている場合は特に、componentsSeparatedByString:よりも適しているほとんどの場合、この

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

ああ、チップありがとう:) – Mikael

関連する問題