3

我正在尝试将 CSV 文件的内容放入数组中。当我在每行有一条记录之前完成此操作时,并将换行符与 一起使用,作为字符集scanUpToCharactersFromSet:intoString:传递:newlineCharacterSet

while ([lineScanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] 
                                   intoString:&line])

现在,我正在处理一个文件,其中许多条目本身都包含换行符。我尝试在每条记录(一个*字符)的末尾添加一个唯一字符,但我的循环只运行一次。有什么东西让我不知道while循环中断吗?这是我现在使用的代码:

NSError *error;
NSString *data = [[NSString alloc] initWithContentsOfFile:[[self delegate] filePath] encoding:NSUTF8StringEncoding error:&error];
NSScanner *lineScanner = [NSScanner scannerWithString:data];
NSString *line = nil;

// Start parsing the CSV file
while ([lineScanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@"*"]
                    intoString:&line]) {
    NSArray *elements = [line componentsSeparatedByString:@","];
    NSLog("Name: %@", [elements objectAtIndex:1]);
}

**编辑:**感谢彼得在下面的回答,我发现我的扫描仪卡在 * 字符后面。我在循环中添加了这一行:

[lineScanner scanCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@"*"] intoString:NULL];

现在它正在正常工作。

4

2 回答 2

2

让我们一次过一遍:

  1. 第一的:

    while ([lineScanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:[NSCharacterSet newlineCharacterSet]] intoString:&line]) {
    

    扫描仪将换行之前的所有内容放入line. 它前进到换行符。

  2. 第二:

    while ([lineScanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:[NSCharacterSet newlineCharacterSet]] intoString:&line]) {
    

    扫描仪已经处于换行状态,因此它不扫描任何字符。如文件所述,由于它没有扫描任何字符,因此它返回NO. 您的循环终止。

解决方案是在循环结束时扫描换行符,让扫描仪通过它。NULL假设您不关心换行符是什么,您可以传递输出参数。

This is correct behavior: If you did/do care what the characters you scanned up to were, this lets you obtain them. That would be more difficult if NSScanner scanned past the characters automatically.

于 2010-01-22T08:19:29.290 回答
0

我认为while条件是错误的。根据String Programming Guide,它应该是这样的:

while ([theScanner isAtEnd] == NO) {
    [lineScanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@"*"] intoString:&line]
    // ...
}
于 2010-01-22T08:05:46.543 回答