2008-12-09 7 views
0

J'ai un service Web qui renvoie des données délimitées par des tabulations (voir l'exemple ci-dessous).Comment utiliser NSScanner pour analyser une chaîne délimitée par des tabulations dans Cocoa?

J'ai besoin d'analyser cela dans un tableau ou similaire afin que je puisse créer une vue de navigation de celui-ci.

J'ai réussi à exécuter la requête Web et j'ai pu analyser un fichier XML, mais ma connaissance d'Objective-C est faible.

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 

Répondre

2

Vous êtes sur la bonne voie avec NSScanner. Vous aurez besoin d'au moins deux scanners: un pour balayer les lignes de toute la chaîne d'entrée, et un scanner pour chaque ligne. Définissez l'analyseur d'entrée complète pour ignorer uniquement les espaces (pas les sauts de ligne), puis:

  1. Numérisez une ligne (chaîne source jusqu'à la fin de la ligne).
  2. Créez un scanner et faites-lui scanner les onglets de la ligne.
  3. Comptez les onglets numérisés. C'est votre niveau d'indentation.
  4. Le reste de la ligne est le numéro et le nom de l'entrée. Vous pouvez balayer la ligne jusqu'à l'espace pour séparer le numéro et le nom, ou les laisser ensemble, selon ce dont vous avez besoin.
  5. Revenir à l'étape 1.

Pour les noms de méthodes spécifiques, voir the NSScanner class reference et the NSCharacterSet class reference.

7

Je ne suis pas sûr que je comprends exactement le format (il affiche un peu étrange pour moi), mais la meilleure façon de le faire est with - (NSArray *)componentsSeparatedByString:(NSString *)separator qui est une méthode dans la classe NSString ... Exemple:

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

Ceci renvoie un NSArray de NSStrings, un pour chaque champ délimité par des tabulations. Si les séparateurs de nouvelle ligne sont importants, vous pouvez utiliser - (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator (également sur NSString) pour séparer en utilisant plusieurs types de délimiteurs.

+0

Ceux qui ne fonctionneront pas, ils retourneront une seule liste à plat. En regardant son exemple, on dirait que l'indentation est importante. –

+0

Merci Brett J'ai effectivement trouvé cette classe moi-même plus tôt, toujours en difficulté mais c'est un point dans la bonne direction directe ... la prochaine question étant ajoutée .... –

+0

Peter - ça marche un peu, mais je perds le 1er record du champs qui commence par un onglet, des suggestions? –

4

J'ai eu un sentiment plus qu'une liste à plat est souhaitée. Si vous voulez une structure multidimensionnelle, vous pouvez faire quelque chose comme ceci:

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.) 
} 
+0

C'est exactement ce que j'avais codé avec un tweak supplémentaire pour gérer ma structure de colonne légèrement douteuse –

Questions connexes