2010-09-26 2 views
0

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

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

//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, и он просто пропускает его.

ответ

0

Не знаете, почему вы инициализируете 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").
+0

Спасибо. Работает отлично. В приведенном выше примере небольшая опечатка scanUpToStringString должна читать scanUpToString. Кроме того, в моем случае мне пришлось изменить символ новой строки на \ r – zio

Смежные вопросы