代码之家  ›  专栏  ›  技术社区  ›  nevan king

scanupCharactersFromset在一个循环后停止

  •  3
  • nevan king  · 技术社区  · 15 年前

    我正在尝试将csv文件的内容放入数组中。当我在每行有一个记录之前做了这项工作,并使用换行符 scanUpToCharactersFromSet:intoString: 通过 newlineCharacterSet 作为字符集:

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

    现在,我正在处理一个文件,其中许多条目本身包含换行符。我尝试在每个记录的结尾添加一个独特的字符(A * 但我的循环只运行一次。是否有什么东西让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];
    

    现在一切正常。

    2 回复  |  直到 9 年前
        1
  •  2
  •   Peter Hosey    15 年前

    让我们一次通过一次:

    1. 第一:

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

      扫描器在线路中断前把所有东西都放进去。 line . 它向新线前进。

    2. 第二:

      while([linescanner scanupcharactersfromset:[nscharacterset charactersetwithcharactersinstring:[nscharacterset newlinecharacterset]]intostring:&line])。{
      

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

    解决办法是 scan the line break 在循环的末尾,让扫描器通过它。你可以通过 NULL 对于输出参数,假设您不关心换行符是什么。

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

        2
  •  0
  •   Laurent Etiemble    15 年前

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

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