0

我正在尝试将 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 子句,它只是跳过了它。

4

1 回答 1

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")。
于 2010-09-26T11:47:17.190 回答