NSScanner не импортирует данные

Я пытаюсь загрузить набор данных по умолчанию из CSV-файла в мою базу данных основных данных. Итак, сначала я пытаюсь прочитать файл csv и вывести его в журнал, прежде чем пытаться добавить его в базу данных основных данных.

Это код, который я использую;

//Find import file;

NSString *defaultCSVPath = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"csv"];

//Get the data into a string

NSString *fileString = [NSString stringWithContentsOfFile:defaultCSVPath encoding:NSUTF8StringEncoding error:nil];

if ( nil == fileString ) {
    NSLog(@"Could not open file data.csv");
    abort();
}
// Create the scanner
NSScanner *scanner = [NSScanner scannerWithString:fileString];

// Ignore new lines
[scanner setCharactersToBeSkipped:
 [NSCharacterSet characterSetWithCharactersInString:@"\n"]];

NSString *sNumber = @"";
NSString *sTitle = @"";

//Gets to here and this expression is never TRUE
while ( [scanner scanString:@"," intoString:&sNumber] && [scanner scanString:@"," intoString:&sTitle]) {
    NSLog(@"sNumber:%@ sTitle:%@",sNumber,sTitle);
}

Пример данных, которые я использую:

A15Q,Test1
F74443AAZ,Test2

Когда я трассирую код, я добираюсь до предложения while, и оно просто пропускает его.


person zio    schedule 26.09.2010    source источник


Ответы (1)


Не знаю, почему вы инициализируете sNumber и sTitle значением @""; nil лучше по умолчанию (или вы можете просто не инициализировать их).

[scanner scanString:@"," intoString:&foo] ожидает увидеть запятую и возвращает запятую в foo (это делается для согласованности и (я думаю) Unicode wotsits).

Вы, вероятно, хотите сделать что-то более похожее на это:

  1. Читать все до запятой.
  2. Пропустить запятую.
  3. Читать все до новой строки.
  4. Пропустить новую строку.

(И мне нужно что-то воткнуть сюда, чтобы форматирование заработало, по какой-то причине.)

while (
     [scanner scanUpToStringString:@"," intoString:&sNumber]
  && [scanner scanString:@"," intoString:NULL]
  && [scanner scanUpToString:@"\n" intoString:&sTitle]
  && [scanner scanString:@"\n" intoString:NULL]
) {
  NSLog(@"sNumber:%@ sTitle:%@",sNumber,sTitle);
}

Предполагая, что вы пытаетесь разобрать CSV, у этого есть свои проблемы:

  • Вы, вероятно, захотите рассматривать \r\n как новую строку.
  • Он не обрабатывает пустые строки или строки без запятой.
  • Он не обрабатывает строки в кавычках (например, "a,b","c,d,e,f").
person tc.    schedule 26.09.2010
comment
Спасибо. Работает отлично. В приведенном выше примере есть небольшая опечатка. scanUpToStringString должен читаться как scanUpToString. Кроме того, в моем случае мне пришлось изменить символ новой строки на \r - person zio; 26.09.2010