¿Cómo uso NSScanner para analizar una cadena delimitada por tabulaciones en Cocoa?

votos
0

Tengo un servicio web que devuelve datos delimitados por tabulaciones (ver ejemplo a continuación).

Necesito analizar esto en una matriz o similar para poder crear una vista de navegación de la misma.

Logré realizar la solicitud web y pude analizar un archivo XML, pero mi conocimiento de Objective-C es pequeño.

433 Eat
    502 Not Fussed
    442 British
    443 Chinese
    444 Dim Sum
    445 Fish
    446 French
    447 Gastropubs
    449 Indian
    451 Italian
    452 Japanese
    453 Middle Eastern
    454 Pan-Asian
    455 Pizza
    456 Spanish
    457 Tapas
    458 Thai
    459 Vegetarian
434 Drink
    501 Not Fussed
    460 Bars 
    461 Pubs
Publicado el 09/12/2008 a las 15:43
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
7

No estoy seguro de entender su formato exactamente (me parece un poco extraño) pero la manera más fácil de hacerlo es with - (NSArray *)componentsSeparatedByString:(NSString *)separatorcuál es un método en la clase NSString ... ejemplo:

NSArray *components = [myString componentsSeperatedByString:@"\t"];

Esto devuelve un valor NSArrayde NSStrings, uno para cada campo delimitado por tabuladores. Si los separadores de nueva línea son importantes, puede usar - (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator(también en NSString) para dividir usando más de un tipo de delimitador.

Respondida el 09/12/2008 a las 17:58
fuente por usuario

votos
4

Tenía un sentimiento más de lo que se quiere una lista plana. Si quieres una estructura multidimensional, puedes hacer algo como esto:

NSArray *lines = [data componentsSeparatedByString:@"\n"];
for (NSString *line in lines) {
    NSArray *fields = [line componentsSeparatedByString:@"\t"];
     // Do something here with each two-element array, such as add to an NSDictionary or to an NSArray (to make a multidimensional array.)
}
Respondida el 09/12/2008 a las 18:13
fuente por usuario

votos
2

Estás en el camino correcto con NSScanner. Necesitará al menos dos escáneres: uno para escanear líneas de toda la cadena de entrada y un escáner para cada línea. Configure el escáner de entrada completa para omitir solo el espacio en blanco (no las líneas nuevas), luego:

  1. Escanee una línea (cadena fuente hasta el final de la línea).
  2. Crea un escáner y haz que escanee las pestañas de la línea.
  3. Cuente las pestañas que escaneó. Ese es tu nivel de sangría.
  4. El resto de la línea es el número de entrada y el nombre. Puede escanear la línea hasta espacios en blanco para separar el número y el nombre, o dejarlos juntos, dependiendo de lo que necesite.
  5. Regresa al paso 1.

Para conocer los nombres de métodos específicos, consulte la referencia de clase NSScanner y la referencia de clase NSCharacterSet .

Respondida el 09/12/2008 a las 18:15
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more