extraire des donnees en provenance d'un NSString

adsads Membre
07:19 modifié dans Objective-C, Swift, C, C++ #1
Bonjour,

j'ai deja utilise un NSXMLParser, mais ici meme si j'ai a faire a un service web, le fichier a un format qui me parrait peu conventionnel. Tout le texte est a la suite et un enregistrement ressemble a ca :
a(cM(pT(9.0333,-79.5),'','<div id=gm><b>San Miguelito, Panamà¡, Panama</b><br><img class=f src=hm> 8 May <a href="javascript:p(423659)">This is the Title</a> <a class=sim title="Related alerts" href=javascript:xP(423659)>»</a> <span class="small">(submitted by: smekaru) </span><br></div>','p6','The Record'));


Donc la premiere chose que je veux faire c'est de "decouper" le NSString pour mettre les enregistrements dans un MutableString.
Et dans un deuxieme temps je veux traiter les champs suivants (je vous montre les sources et ce que je recupere) :

-      pT(9.0333,-79.5)      ->    Long = 9.0333  et Lat = 79.5
-      <b>San Miguelito, Panamà¡, Panama</b>      ->      city = @San Miguelito, Panamà¡, Panama
-      > 8 May <    ->    date = 8 May
-      p(423659)    ->    link = 423659
-      img class=f    ->    img1 = f
-      src=hm          ->    img2 = hm

Donc evidement deux questions :
Quelle fonction puis-je utiliser pour la separation des enregistrements ?
Quelle(s) fonction(s) puis-je utiliser pour extraire les champs ?

merci

Réponses

  • tabliertablier Membre
    07:19 modifié #2
    pour les champs, il n'y a que toi qui pourras trouver la bonne méthode après analyse des contenus: voir la méthode componentsSeparatedByString:  ou la méthode  componentsSeparatedByCharactersInSet:
    Pour séparer les lignes, la solution doit être là : Lire un fichier texte ligne par ligne
  • adsads Membre
    07:19 modifié #3
    Merci Tablier pour ta reponse,
    j'avais utilise componentsSeparatedByString pour extraire les enregistrements.
    je vais essayer effectivement componentsSeparatedByCharactersInSet pour les champs pour voir si dans certains cas ca marche.
    Je me demande pourquoi certains font des formats de fichiers aussi malpropres  :o
  • AliGatorAliGator Membre, Modérateur
    07:19 modifié #4
    Sinon tu peux utiliser NSScanner, c'est orienté parsing de chaà®nes justement... avec des "scanUpToCharactersInSet:intoString:" ou "scanUpToString:intoString:" pour "passer" les caractères que tu ne veux pas stocker (genre parser jusqu'à  la première parenthèse "("), puis pour lire les chaà®nes qui t'intéressent, les nombres, etc... tu devrais avoir tout ce qu'il faut.
  • AliGatorAliGator Membre, Modérateur
    mai 2010 modifié #5
    Exemple :
    NSScanner* scan = [NSScanner scannerWithString:@&quot;a(cM(pT(9.0333,-79.5),&#39;&#39;,&#39;&lt;div id=gm&gt;&lt;b&gt;San Miguelito, Panamà¡, Panama&lt;/b&gt;&lt;br&gt;&lt;img class=f src=hm&gt; 8 May &lt;a href=&quot;javascript:p(423659)&quot;&gt;This is the Title&lt;/a&gt; &lt;a class=sim title=&quot;Related alerts&quot; href=javascript:xP(423659)&gt;&amp;raquo;&lt;/a&gt; &lt;span class=&quot;small&quot;&gt;(submitted by: smekaru) &lt;/span&gt;&lt;br&gt;&lt;/div&gt;&#39;,&#39;p6&#39;,&#39;The Record&#39;));&quot;];<br /><br />[scan scanUpToString:@&quot;pT(&quot; intoString:nil]; // se placer au début de &quot;pt(&quot;<br />[scan setScanLocation:[scan scanLocation]+3]; // passer ce &quot;pt(&quot; pour se placer sur la latitude<br />float lat, long;<br />[scan scanFloat:&amp;lat]; // lire la latitude<br />[scan scanString:@&quot;,&quot; intoString:nil]; // passer la virgule<br />[scan scanFloat:&amp;long]; // lire la longitude<br /><br />[scan scanUpToString:@&quot;&lt;b&gt;&quot; intoString:nil]; // avancer jusqu&#39;au &quot;&lt;b&gt;&quot; suivant<br />[scan setScanLocation:[scan scanLocation]+3]; // passer ce &quot;&lt;b&gt;&quot;<br />NSString* addr = nil;<br />[scan scanUpToString:@&quot;&lt;/b&gt;&quot; intoString:&amp;addr]; // lire l&#39;adresse (s&#39;arrêter juste avant le &quot;&lt;/b&gt;&quot;<br />...<br />// ... etc.
    
  • adsads Membre
    07:19 modifié #6
    Merci AliGator,

    toujours au top comme d'hab 
  • adsads Membre
    mai 2010 modifié #7
    ??? j'ai cru que ma reponse a AliGator etait partie mais non... donc 2 reponses de suites.

    Je dois etre sans doute tres fatigue en ce moment mais j'ai un soucis avec un scanUpToString qui me renvoie toujours une valeur true  :(

    en fait dans mon fichier a parser, je me rends compte qu'il y a du maitre detail (un lieu = X infos).
    Le debut des infos detail commence tj par
    &lt;br&gt;&lt;img
    

    donc si il y a 15 enregistrements details, ca va par contre , il me renvoie toujours true apres le 15 eme.
    C'est la fonction qui a un soucis ou c'est moi qui est bogue ?

    BOOL b;<br />			b = YES;<br />			while (b)&nbsp; {				<br />				b = [scan scanUpToString:@&quot;&lt;br&gt;&lt;img&quot; intoString:nil]; // avancer jusqu&#39;au &quot;&lt;br&gt;&lt;img&quot; suivant<br />				NSLog(@&quot;%d&quot;,b);<br />				if (b) {<br />					[scan scanUpToString:@&quot;class=&quot; intoString:nil]; // avancer jusqu&#39;au &quot;class=&quot; suivant<br />					[scan setScanLocation:[scan scanLocation]+6]; // passer ce &quot;class=&quot;<br />					NSString* classe = nil;<br />					[scan scanUpToString:@&quot; &quot; intoString:&amp;classe]; // lire la classe (s&#39;arrêter juste avant le &quot; &quot;<br />					//NSLog(@&quot;Classe IMG1 %@&quot;,classe);<br />					<br />					[scan scanUpToString:@&quot;src=&quot; intoString:nil]; // avancer jusqu&#39;au &quot;src=&quot; suivant<br />					[scan setScanLocation:[scan scanLocation]+5]; // passer ce &quot;src=&quot;<br />					NSString* img1Src = nil;<br />					[scan scanUpToString:@&quot;&gt;&quot; intoString:&amp;img1Src]; // lire la classe (s&#39;arrêter juste avant le &quot;&gt;&quot;<br />					//NSLog(@&quot;IMG1 %@&quot;,img1Src);<br />					<br />					[scan setScanLocation:[scan scanLocation]+1]; // passer ce &quot;&gt;&quot;<br />					NSString* date = nil;<br />					[scan scanUpToString:@&quot;&lt;&quot; intoString:&amp;date]; // lire la classe (s&#39;arrêter juste avant le &quot;&lt;&quot;<br />					//NSLog(@&quot;Date %@&quot;,date);<br />					<br />					<br />					<br />					[scan scanUpToString:@&quot;:p(&quot; intoString:nil]; // avancer jusqu&#39;au &quot;:p(&quot; suivant<br />					[scan setScanLocation:[scan scanLocation]+3]; // passer ce &quot;:p(&quot; pour se placer sur le lien<br />					int link;<br />					[scan scanInt:&amp;link]; // lire la latitude<br />					//NSLog(@&quot;lien %d&quot;,link );<br />					<br />					[scan scanUpToString:@&quot;&gt;&quot; intoString:nil]; // avancer jusqu&#39;au &quot;&gt;&quot; suivant<br />					[scan setScanLocation:[scan scanLocation]+1]; // passer ce &quot;&gt;&quot;<br />					NSString* News1Title = nil;<br />					[scan scanUpToString:@&quot;&lt;/a&gt;&quot; intoString:&amp;News1Title]; // lire la classe (s&#39;arrêter juste avant le &quot;&lt;/a&gt;&quot;<br />					NSLog(@&quot;News1 Title %@&quot;,News1Title);<br />				}<br />				<br />			}<br />
    


    merci
  • adsads Membre
    mai 2010 modifié #8
    A premiere vue je dois faire ca pour que ca marche : b = [scan scanUpToString:@<img intoString:&testString];

    non meme pas, je dois ensuite ananlyser la valeur de teststring car b est toujours a YES  >:(

    Faut bricoller autour quoi...
  • AliGatorAliGator Membre, Modérateur
    07:19 modifié #9
    D'après la doc sur cette méthode :
    If the search string (stopString) isn't present in the scanner's source string, the remainder of the source string is put into stringValue, the receiver's scanLocation is advanced to the end of the source string, and the method returns YES.
    Donc en fait quand tu en es à  ta dernière occurrence, et que tu demandes [tt][scan scanUpToString:@img ...][/tt] il va scanner la chaà®ne jusqu'à  rencontrer le texte "img"... ou jusqu'à  la fin de la chaà®ne s'il ne la trouve pas.

    Donc au final pour tester si tu as consommé tous tes "<img", tu peux faire un scanUpToString:intoString: et ensuite, non pas vérifier la valeur de retour, mais regarder si la scanLocation est égale à  la length de la string que tu scannes, donc regarder si tu es à  la fin de la chaà®ne ou pas. Car dans ce cas pour le dernier il scanne bien des caractères, jusqu'à  la fin de la chaà®ne (à  défaut d'avoir trouver un "<img" pour l'arrêter), c'est pour ça qu'il retourne YES.
  • adsads Membre
    07:19 modifié #10
    Effectivement, ca marche bien, va sera moins gourmand en ressource car j'eviterais les recherche de substring.
    Merci encore AliGator 
Connectez-vous ou Inscrivez-vous pour répondre.