2008-12-05 17 views
7

Wenn ich einen NSString mit einer Textdatei darin habe, wie bekomme ich ein NSArray von NSString mit jedem NSString, der eine Zeile der Datei enthält.Wie bekomme ich jede Zeile von einem NSString?

In 10.5 habe ich diese:

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

Aber das funktioniert nicht in 10.4, und mein Programm muss in 10.4 arbeiten.

Es muss auch mit \ r, \ n und \ r \ n Zeilenenden arbeiten.

Antwort

10

Der folgende Code ist gerade aus 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]]; 
} 

Ich bin nicht 100% sicher, ob es mit 10,4

+0

Ich kompiliere ohne Warnungen, wenn das Ziel auf 10,4 eingestellt ist und es funktioniert gut. Vielen Dank. –

3

Gerade von einem Projekt von mir arbeiten:

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

Ich bin nicht sicher, wie man es automatisch mit jeder Art von Zeile, die in 10.4 endet, macht.

5

Ich werde zuerst alle "\ r" durch "\ n" ersetzen, dann ersetzen Sie alle "\ n \ n" durch "\ n", und machen Sie dann einen componentsSeparatedByString: @ "\ n".

+0

Nicht die effizienteste Lösung, aber +1, um clever zu sein –

5

Zählt alle Zeilen in einem String enumerateLinesUsingBlock:

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

Declaration

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

Parameter

block dem Block für den enumerati ausgeführt unter Verwendung von auf.

Der Block nimmt zwei Argumente:

line Die aktuelle Zeile der Zeichenfolge aufgezählt werden. Die Zeile enthält nur den Inhalt der Zeile ohne die Zeilenabschlusszeichen.

stop Ein Verweis auf einen booleschen Wert, den der Block verwenden kann, um die Enumeration durch Setzen von * stop = YES zu stoppen; es sollte nicht berühren * stop sonst.

Verfügbarkeit Verfügbar in OS 10.6 und iOS 4.0 und höher.

0

können Sie tun auch enumerateSubstringsInRange: mit dem NSStringEnumerationByLines und/oder NSStringEnumerationByParagraphs Optionen.

Der Vorteil dabei ist, dass Sie NSRange für jeden Teilstring erhalten und auch den Anfangsbereich des zu nummerierenden Strings festlegen können.

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

}]; 
Verwandte Themen