2008-12-05 88 views
7

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

在10.5我这样做:

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

但是,这并不在10.4的工作,我的程序需要在10.4的工作。

同样,它需要与\ r,\ n和\ r \ n行结尾一起工作。

回答

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

+0

当目标设置为10.4时,我编译时没有警告,它运行良好。谢谢。 – 2008-12-05 02:15:24

3

工作直接从我的一个项目:

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

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

5

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

+0

不是最有效的解决方案,而是因为聪明才对+1 – 2008-12-05 02:31:21

5

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

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

宣言

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

参数

block用于enumerati执行的块上。

块使用两个参数:

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

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

可用性可在OS 10.6iOS 4.0及以后。

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) { 

}];