scanUpToCharactersFromSet在一个循环后停止

时间:2010-01-22 06:58:17

标签: objective-c csv cocoa lexical-analysis

我正在尝试将CS​​V文件的内容放入数组中。当我在每行记录一条记录之前完成此操作,并使用带有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]);
}

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

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

现在它的工作方式应该如此。

2 个答案:

答案 0 :(得分:2)

让我们一次过一遍:

  1. 首先:

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

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

  2. 第二

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

    扫描仪已处于换行符,因此它不扫描任何字符。 As documented,因为它没有扫描任何字符,所以会返回NO。你的循环终止了。

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

    这是正确的行为:如果你确实/关心你扫描的字符是什么,这可以让你获得它们。如果NSScanner自动扫描字符,那将更加困难。

答案 1 :(得分:0)

我认为while条件是错误的。根据{{​​3}},它应该是这样的:

while ([theScanner isAtEnd] == NO) {
    [lineScanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@"*"] intoString:&line]
    // ...
}