Como faço para usar NSScanner para analisar uma cadeia delimitada guia em Cocoa?

votos
0

Eu tenho um serviço web que retorna dados de tabulação delimitado (veja exemplo abaixo).

Eu preciso analisar isso em uma matriz ou similar para que eu possa criar uma vista de navegação do mesmo.

Eu consegui realizar a solicitação da web e pode analisar um arquivo XML, mas meu conhecimento de Objective-C é pequena.

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 09/12/2008 em 15:43
fonte usuário
Em outras línguas...                            


3 respostas

votos
7

Eu não tenho certeza se entendi o formato exatamente (ele exibe um pouco estranho para mim), mas a maneira mais fácil de fazer isso é with - (NSArray *)componentsSeparatedByString:(NSString *)separatorque é um método na classe NSString ... exemplo:

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

Este retorna um NSArraydos NSStrings, um para cada campo delimitado por tabulação. Se os separadores de nova linha são importantes que você pode usar - (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator(também on NSString) para dividir usando mais de um tipo de delimitador.

Respondeu 09/12/2008 em 17:58
fonte usuário

votos
4

Eu tinha a sensação de mais do que uma lista simples é procurado. Se você quer uma estrutura multidimensional que você pode fazer algo como isto:

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.)
}
Respondeu 09/12/2008 em 18:13
fonte usuário

votos
2

Você está no caminho certo com NSScanner. Você vai precisar de pelo menos dois scanners: um para escanear linhas de toda a cadeia de entrada, e um scanner para cada linha. Defina o scanner de entrada inteiro para pular somente espaços em branco (não novas linhas), então:

  1. Varredura de uma linha (string fonte até ao fim-de-linha).
  2. Criar um scanner e tê-lo a varredura guias da linha.
  3. Conte as abas que você digitalizados. Esse é o seu nível de recuo.
  4. O resto da linha é o número de entrada e nome. Você poderia fazer a varredura da linha até espaços em branco para separar o número e nome, ou deixá-los em conjunto, dependendo do que você precisa.
  5. Volte para a etapa 1.

Para nomes de métodos específicos, consulte a referência de classe NSScanner e a referência de classe NSCharacterSet .

Respondeu 09/12/2008 em 18:15
fonte usuário

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