2008-12-05 11 views
7

Si tengo un NSString con un archivo de texto, ¿cómo obtengo un NSArray de NSString con cada NSString que contiene una línea del archivo?¿Cómo obtengo cada línea de un NSString?

En 10,5 Hice esto:

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

Pero eso no funciona en el 10,4, y mi programa tiene que trabajar en el 10,4.

Además, necesita trabajar con terminaciones de línea \ r, \ n y \ r \ n.

Respuesta

10

El código siguiente es directamente desde 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]]; 
} 

No estoy 100% seguro de si va a trabajar con un 10,4

+0

Compilo sin advertencias cuando el objetivo está establecido en 10.4 y funciona bien. Gracias. –

3

directamente de un proyecto mío:

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

No estoy seguro de cómo hacerlo para que funcione automáticamente con cualquier tipo de línea que termine en 10.4.

5

Primero reemplazaré todo "\ r" con "\ n", luego reemplazaré todo "\ n \ n" con "\ n", y luego haré un componentsSeparatedByString: @ "\ n".

+0

No es la solución más eficiente, pero +1 por ser inteligente al respecto –

5

Enumera todas las líneas de una cadena mediante enumerateLinesUsingBlock:

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

Declaración

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

Parámetros

block El bloque ejecutado para el enumerati en.

El bloque tiene dos argumentos:

line La línea actual de la cadena empadronado. La línea contiene solo el contenido de la línea, sin los terminadores de línea.

stop Una referencia a un valor booleano que el bloque puede usar para detener la enumeración estableciendo * stop = YES; no debería tocar * detener en caso contrario.

Disponibilidad Disponible en OS 10.6 y iOS 4.0 y posterior.

0

También se puede hacer con el enumerateSubstringsInRange:NSStringEnumerationByLines y/o NSStringEnumerationByParagraphs opciones.

El beneficio de hacerlo de esa manera es que obtiene el NSRange de cada subcadena, y también puede establecer el rango inicial de la cadena para enumerar.

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

}]; 
Cuestiones relacionadas