1

我有一个大文本文件(大约 10 MB)。在文本文件中有类似的值(行之间没有空行,我无法在此处正确格式化):

;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应该这样做吗?如果是这样,谁能给我一个例子来说明如何做到这一点?

谢谢!

4

2 回答 2

0

您应该使用快速枚举。它比使用objectEnumerator. 试试这个

for (NSString *word in words) {
    // do the thing you need
}
于 2010-12-10T09:22:52.097 回答
0

在大多数情况下NSScanner,它比 更适合componentsSeparatedByString:,尤其是当您试图保留内存时。

您的文件可以通过这样的循环解析:

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
}

您可能需要为此添加错误检查代码,以防您获得无效文件。

于 2010-12-10T09:31:59.417 回答