Parser une NSString

UniXUniX Membre
12:22 modifié dans API AppKit #1
Salut.

Voilà , j'ai des données qui arrivent sous forme de NSString. Ces données sont morcellées dans la string, avec des virgules pour séparer chaque bout de donnée. Exemple :
AAAA,12587,F,65874,8954123

Chaque morceau entre virgules représente donc un morceau de la donnée. Mon but est de séparer le tout, pour obtenir :
NSString *toto = AAAA<br />int titi = 12587<br />...


Quelle est la meilleure façon de s'y prendre ?
J'ai pensé découper les strings X fois avec des NSRange, mais je sais pas si c'est la meilleure façon de faire ...

Réponses

  • AliGatorAliGator Membre, Modérateur
    octobre 2005 modifié #2
    Salut

    Pour moi le mieux c'est componentsSeparatedByString: de la classe NSString. Ca va te renvoyer un NSArray, et ensuite tu récupères tes données dans l'ordre
    NSString* flux = @&quot;AAAA,12587,F,65874,8954123&quot;; // récupérée je ne sais comment, c&#39;est ton texte à  parser quoi<br /><br />NSArray* params = [flux componentsSeparatedByString:@&quot;,&quot;];<br /><br />NSString* toto = [params objectAtIndex:0]; // = &quot;AAAA&quot;<br />int titi = [[params objectAtIndex:1] intValue]; // = 12587<br />...<br />
    
    Tu peux aussi mettre tes données dans un dictionnaire pour les récupérer plus proprement ensuite, avec dictionaryWithObjects:(NSArray *)objects forKeys:(NSArray *)keys, avec un code du genre :
    NSArray* params = [flux componentsSeparatedByString:@&quot;,&quot;];<br />NSArray* keys = [NSArray arrayWithObjects:@&quot;texte&quot;,@&quot;nombre&quot;,@&quot;lettre&quot;,@&quot;n2&quot;,@&quot;n3&quot;,nil];<br />NSDictionary* dico = [NSDictionary dictionaryWithObjects:params forKeys:keys];<br /><br />NSLog(@&quot;par exemple : %@&quot; , [dico valueForKey:@&quot;n2&quot;]); // affichera 65874<br />NSLog(@&quot;données parsées : %@&quot; , dico); // c&#39;est plus clair dans un dico
    
    Ceci dit toutes les données dans le dico dans ce cas seront des NSString et il faudra bien que tu récupères leur intValue pour les clés "nombre", "n2" et "n3"...
    Ou alors une classe personnalisée qui représente les données que tu veux récupérer, avec un constructeur prennant un NSArray en paramètre...

    Le coup du dictionnaire ou de la classe personnalisée, c'est pour être plus propre côté modèle objet si tes données représentent qqch de particulier, pour manipuler des "objets" plus proprement qu'en manupilant leurs composantes séparées... Je ne sais pas ce que représentent ets valeurs de ta chaà®ne à  virgules, mais ça peut être utile si elles représentent des valeurs décrivant un objet particulier par exemple, de lui faire une classe dédiée... Après c'est toi qui voit.
  • UniXUniX Membre
    12:22 modifié #3
    Ah ouais, je connaissais pas ce truc  ???
    Mais effectivement ça a l'air d'être exactement ce dont j'ai besoin .....
  • AliGatorAliGator Membre, Modérateur
    12:22 modifié #4
    Pour un parsing un peu plus avancé, tu peux aussi regarder du côté de NSScanner si besoin. Jamais utilisé mais ça a l'air d'être intéressant  :o
    C'est un peu le sscanf du C/C++, si tu veux  ;)
  • BruBru Membre
    12:22 modifié #5
    dans 1130165380:

    Pour un parsing un peu plus avancé, tu peux aussi regarder du côté de NSScanner si besoin. Jamais utilisé mais ça a l'air d'être intéressant  :o
    C'est un peu le sscanf du C/C++, si tu veux  ;)


    Le NSScanner sert plus à  retrouver un "motif" au sein d'une chaà®ne (par exemple, extraire un numérique logé au sein d'une phrase), plutôt que d'éclater une chaà®ne en sous-chaà®ne (componentsSeparatedByString: de NSString que tu as donné comme solution dans ton 1er post est parfait pour ça).

    Un petit exemple d'utilisation de NSScanner ici-même.

    .
  • AliGatorAliGator Membre, Modérateur
    octobre 2005 modifié #6
    Tiens d'ailleurs j'en profite pour poser une question qui est née quand j'ai répondu à  ce post :

    Y a-t-il un équivalent à  scanf (ou fscanf ou sscanf) en Cocoa ?
    Bon ok on peut utiliser scanf directement, mais bon, un équivalent en Cocoa-pur, qui fonctionnerait sur dse NSString, genre
    NSString* test = @&quot;Texte - 5/4/18/2 - 0xCD&quot;;<br />NSString* texte;<br />NSNumber *a,*b,*c,*d, *e;<br /><br />BOOL ok = [test parseWithFormat: @&quot;%s - %d/%d/%d/%d - %02X&quot; , texte,a,b,c,d,e];
    
    Enfin qqch dans ce gout là  quoi. Une sorte de fonction inverse de la fonction stringWithFormat en somme :P
  • Eddy58Eddy58 Membre
    octobre 2005 modifié #7
    Ca doit pouvoir se faire, en sous-classant NSString. Ensuite tu bricoles ta méthode parseWithFormat: avec NSScanner, ou scanf directement. :)
  • AliGatorAliGator Membre, Modérateur
    12:22 modifié #8
    Mouais...
    1) Autant faire une catégorie plutôt qu'une sous-classe
    2) Ce qui me gêne de passer par une fonction C genre scanf si jamais on implémente ça nous même, c'est le risque que ça peut engendrer pour les chaà®nes UTF8 ou UTF16 et les caractères spéciaux... Mais bon s'il n'y a que ça, et puisque l'utilisation de scanf se fera sans doute pas sur du texte en japonais... :)
Connectez-vous ou Inscrivez-vous pour répondre.