NSScanner против компонентовSeparatedByString - PullRequest
1 голос
/ 10 декабря 2010

У меня большой текстовый файл (около 10 МБ).В текстовом файле есть такие значения, как (без пустых строк между строками, я не могу правильно отформатировать его здесь):

;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, и если да, может ли кто-нибудь дать мне пример того, как это сделать?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 10 декабря 2010

В большинстве случаев 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
}

Возможно, вам понадобится добавить код проверки ошибок на случай, если вы получите неверный файл.

0 голосов
/ 10 декабря 2010

Вы должны использовать быстрое перечисление.Это намного лучше, чем тот, который использует objectEnumerator.Попробуйте это

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