如果我有一个带有文本文件的NSString,如何获得一个NSString的NSArray,每个NSString包含一行文件。
在10.5中我做到了:
NSArray* lines = [str componentsSeparatedByCharactersInSet: [NSCharacterSet newlineCharacterSet]];
但这在10.4中不起作用,我的程序需要在10.4中工作。
同样,它需要使用\ r,\ n和\ r \ n行结尾。
答案 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:¶Start end:¶End
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.6
和iOS 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) {
}];