una separar recortar por parte palabra longitud letras extraer ejemplos caracteres caracter cadena ios nsstring newline

ios - recortar - separar string por caracter java



Cómo dividir una cadena con nuevas líneas (6)

Aquí está mi opinión sobre esto:

NSString* string = @"FOO/r/nBAR/r/r/n/rATZ/rELM327 v1.5"; NSCharacterSet* newlineSet = [NSCharacterSet newlineCharacterSet]; NSCharacterSet* whitespaceSet = [NSCharacterSet whitespaceAndNewlineCharacterSet]; NSArray<NSString*>* components = [string componentsSeparatedByCharactersInSet:newlineSet]; NSPredicate* predicate = [NSPredicate predicateWithBlock:^BOOL(NSString* _Nullable string, NSDictionary<NSString *,id> * _Nullable bindings){ return [string stringByTrimmingCharactersInSet:whitespaceSet].length > 0; }]; NSArray<NSString*>* lines = [components filteredArrayUsingPredicate:predicate]; [lines enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { NSLog( @"Line %u = ''%@''", idx, obj ); }];

Ejecutando esto imprime:

2017-10-24 15:26:05.380 Untitled 5[64977:3182818] Line 0 = ''FOO'' 2017-10-24 15:26:05.380 Untitled 5[64977:3182818] Line 1 = ''BAR'' 2017-10-24 15:26:05.380 Untitled 5[64977:3182818] Line 2 = ''ATZ'' 2017-10-24 15:26:05.380 Untitled 5[64977:3182818] Line 3 = ''ELM327 v1.5''

Puede que no sea la forma más eficiente (probablemente usar un NSScanner sería más rápido), pero resuelve el problema aquí.

Leo de un archivo csv y quiero dividir la cadena larga que obtengo usando stringWithContentsOfFile, que es una cadena de varias líneas, con líneas individuales que representan filas en el archivo csv. ¿Cómo hago esto?


Debe separar su contenido con "/ n".

NSString *str= [NSString stringWithContentsOfFile:filePathLib encoding:NSUTF8StringEncoding error:nil]; NSArray *rows = [str componentsSeparatedByString:@"/n"]; for(int i =0;i<[rows count];i++) NSLog(@"Row %d: %@",i,[rows objectAtIndex:i]);


Debe tener en cuenta que /n no es el único carácter utilizado para dividir una nueva línea. Por ejemplo, si el archivo se guardó en Windows, los caracteres de nueva línea serían /r/n . Lea el artículo de Newline en Wikipedia para obtener más información sobre esto.

Por lo tanto, si solo utiliza componentsSeparatedByString("/n") , puede obtener resultados inesperados.

let multiLineString = "Line 1/r/nLine 2/r/nLine 3/r/n" let lineArray = multiLineStringRN.componentsSeparatedByString("/n") // ["Line 1/r", "Line 2/r", "Line 3/r", ""]

Tenga en cuenta tanto el elemento residual /r como el elemento de matriz vacío.

Hay varias formas de evitar estos problemas.

Soluciones

1. componentsSeparatedByCharactersInSet

let multiLineString = "Line 1/nLine 2/r/nLine 3/n" let newlineChars = NSCharacterSet.newlineCharacterSet() let lineArray = multiLineString.componentsSeparatedByCharactersInSet(newlineChars).filter{!$0.isEmpty} // "[Line 1, Line 2, Line 3]"

Si no se utilizara el filter , entonces /r/n produciría un elemento de matriz vacío porque se cuenta como dos caracteres y, por lo tanto, separa la cadena dos veces en la misma ubicación.

2. split

let multiLineString = "Line 1/nLine 2/r/nLine 3/n" let newlineChars = NSCharacterSet.newlineCharacterSet() let lineArray = multiLineString.utf16.split { newlineChars.characterIsMember($0) }.flatMap(String.init) // "[Line 1, Line 2, Line 3]"

o

let multiLineString = "Line 1/nLine 2/r/nLine 3/n" let lineArray = multiLineString.characters.split { $0 == "/n" || $0 == "/r/n" }.map(String.init) // "[Line 1, Line 2, Line 3]"

Aquí /r/n se cuenta como un solo carácter Swift (un grupo de grafemas extendido)

3. enumerateLines

let multiLineString = "Line 1/nLine 2/r/nLine 3/n" var lineArray = [String]() multiLineString.enumerateLines { (line, stop) -> () in lineArray.append(line) } // "[Line 1, Line 2, Line 3]"

Para obtener más información sobre la sintaxis de enumerateLine , vea también esta respuesta .

Notas:

  • una cadena de líneas múltiples no suele mezclar /r/n y /n pero estoy haciendo esto aquí para mostrar que estos métodos pueden manejar ambos formatos.
  • NSCharacterSet.newlineCharacterSet() son caracteres de nueva línea definidos como (U + 000A – U + 000D, U + 0085), que incluyen /r /n .
  • Esta respuesta es un resumen de las respuestas a mi pregunta anterior . Lee esas respuestas para más detalles.

En caso de que alguien tropiece con esta pregunta como yo lo hice. Esto funcionará con cualquier carácter de nueva línea:

NSCharacterSet *separator = [NSCharacterSet newlineCharacterSet]; NSArray *rows = [yourString componentsSeparatedByCharactersInSet:separator];


Puede dividir la cadena en matrices de cadena y luego manipularla como desee.

NSArray *brokenByLines=[yourString componentsSeparatedByString:@"/n"]


Versión Swift 3 :

let lines = yourString.components(separatedBy: .newlines)

Agradable y corto.