2008-12-05 8 views
7

Если у меня есть NSString с текстовым файлом в нем, как мне получить NSArray из NSString с каждой 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

2

В соответствии с NSString class reference сообщение NSString componentsSeparatedByCharactersInSet: доступно в OS X 10.5 или новее. Вам нужно использовать componentsSeparatedByString :.

+0

Извините, я не рассказал вам, как это сделать, просто почему ваше решение не работает в 10.4. – 2008-12-05 01:05:33

3

Прямо из проекта шахты:

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

Я не уверен, как заставить его автоматически работать с любым типом строки, заканчивающимся на 10.4.

5

Сначала я заменил все «\ r» на «\ n», а затем заменил все «\ n \ n» на «\ n», а затем выполнил компонентыSeparatedByString: @ "\ 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; он не должен касаться * stop иначе.

Доступность: Доступно в OS 10.6 и iOS 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) { 

}]; 
Смежные вопросы