代码之家  ›  专栏  ›  技术社区  ›  Roland Rabien

如何从nsstring中获取每一行?

  •  7
  • Roland Rabien  · 技术社区  · 16 年前

    如果我有一个包含文本文件的nsstring,如何获得一个nsstring数组,其中每个nsstring包含一行文件。

    在10.5年,我做到了:

    NSArray* lines = [str componentsSeparatedByCharactersInSet: [NSCharacterSet newlineCharacterSet]];
    

    但这在10.4中不起作用,我的程序需要在10.4中起作用。

    此外,它还需要使用\r、\n和\r\n行结尾。

    6 回复  |  直到 7 年前
        1
  •  10
  •   Bryan    7 年前

    以下代码直接来自 Apple's documentation regarding paragraphs and line breaks :

    unsigned length = [string length];
    unsigned paraStart = 0, paraEnd = 0, contentsEnd = 0;
    NSMutableArray *array = [NSMutableArray array];
    NSRange currentRange;
    while (paraEnd < length)
    {
        [string getParagraphStart:&paraStart end:&paraEnd
        contentsEnd:&contentsEnd forRange:NSMakeRange(paraEnd, 0)];
        currentRange = NSMakeRange(paraStart, contentsEnd - paraStart);
        [array addObject:[string substringWithRange:currentRange]];
    }
    

    我不能百分之百确定它是否适用于10.4

        2
  •  5
  •   Heng-Cheong Leong    16 年前

    我将首先用\n替换所有的\r“,然后用\n替换所有的\n \n”,然后执行由字符串@\n分隔的组件。

        3
  •  5
  •   Vineet Choudhary    9 年前

    使用枚举字符串中的所有行 enumerateLinesUsingBlock:

    [yourString enumerateLinesUsingBlock:^(NSString * _Nonnull line, BOOL * _Nonnull stop) {
        //line
    }];
    

    宣言

    - (void)enumerateLinesUsingBlock:(void (^)(NSString *line,
                                       BOOL *stop))block
    

    参数

    block 为枚举执行的块。

    块接受两个参数:

    line 正在枚举的字符串的当前行。线 只包含行的内容,不包含行终止符。

    stop 对可用于停止的布尔值的引用。 通过设置*停止=是的枚举;不应触摸*停止 否则。

    可利用性 可在 OS 10.6 iOS 4.0 后来。

        4
  •  3
  •   Bhavin Bhadani    8 年前

    直接从我的项目:

     NSString * fileContents = [NSString stringWithContentsOfFile:pathToFile encoding:NSUTF8StringEncoding error:nil];
     NSMutableArray * fileLines = [[NSMutableArray alloc] initWithArray:[fileContents componentsSeparatedByString:@"\r\n"] copyItems: YES];
    

    我不知道如何使它自动与任何类型的行在10.4结束。

        5
  •  2
  •   John Safranek    16 年前

    根据 NSString class reference ,nsstring消息 componentsSeparatedByCharactersInSet: 在OS X 10.5或更高版本中提供。您需要使用componentsseparatedbystring:。

        6
  •  0
  •   siburb    7 年前

    你也可以这样做 enumerateSubstringsInRange: NSStringEnumerationByLines 和/或 NSStringEnumerationByParagraphs 选项。

    这样做的好处是,您可以获得每个子字符串的nsrange,还可以设置字符串的初始范围来枚举。

    [myString enumerateSubstringsInRange:NSMakeRange(0, myString.length) options:NSStringEnumerationByLines | NSStringEnumerationByParagraphs usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
    
    }];