2008-12-05 66 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) { 

}];