如何从NSString中获取每一行?

时间:2008-12-05 00:56:02

标签: objective-c cocoa macos

如果我有一个带有文本文件的NSString,如何获得一个NSString的NSArray,每个NSString包含一行文件。

在10.5中我做到了:

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

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

同样,它需要使用\ r,\ n和\ r \ n行结尾。

6 个答案:

答案 0 :(得分:10)

以下代码直接来自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]];
}

我不是100%确定它是否适用于10.4

答案 1 :(得分:6)

使用enumerateLinesUsingBlock:

枚举字符串中的所有行
[yourString enumerateLinesUsingBlock:^(NSString * _Nonnull line, BOOL * _Nonnull stop) {
    //line
}];
  

<强>声明

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

<强>参数

     

block为枚举执行的块。

     

该块有两个参数:

     

line枚举字符串的当前行。这条线   只包含该行的内容,没有行终止符。

     

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

     

可用性OS 10.6iOS 4.0及更高版本中可用。

答案 2 :(得分:5)

我首先用“\ n”替换所有“\ r”,然后将所有“\ n \ n”替换为“\ n”,然后执行componentsSeparatedByString:@“\ n”。

答案 3 :(得分:3)

直接来自我的一个项目:

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

我不知道如何使它自动适用于以10.4结尾的任何类型的行。

答案 4 :(得分:2)

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

答案 5 :(得分:0)

您还可以使用enumerateSubstringsInRange:和/或NSStringEnumerationByLines选项NSStringEnumerationByParagraphs进行操作。

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

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

}];