views:

16

answers:

1

I'm trying to load a default set of data from a csv file into my core data db. So initially i'm trying to read in a csv file and output it to the log before trying to add it to the core data database.

This is the code i'm using;

//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);
}

The sample data i'm using is;

A15Q,Test1
F74443AAZ,Test2

When I trace the code, I get to the while clause and it just skips over it.

A: 

Not sure why you initialize sNumber and sTitle to @""; nil is a better default (or you can just not initialize them).

[scanner scanString:@"," intoString:&foo] expects to see a comma and returns the comma in foo (it does this for consistency and (I think) Unicode wotsits).

You probably want to do something more like this:

  1. Read everything before the comma.
  2. Skip over the comma.
  3. Read everything before the newline.
  4. Skip over the newline.

(And I need to stick something here for the formatting to work, for some reason.)

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

Assuming you're trying to parse CSV, this has its own problems:

  • You probably want to treat \r\n as a newline.
  • It doesn't cleanly handle blank lines or lines without a comma.
  • It doesn't handle quoted strings (e.g. "a,b","c,d,e,f").
tc.
Thanks. Works perfectly. There's a small typo in the above example scanUpToStringString should read scanUpToString. Also, in my case I had to change the newline character to \r
zio