IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

extraire des mots à partir d'une chaine


Sujet :

Delphi

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut extraire des mots à partir d'une chaine
    bonjour
    j'ai une chaine de caractères de la forme:
    MyString := 'param1=%par1&param2=%par2&param3=%par3'
    ou encore
    MyString := 'param1=%par1%par2&param3=%par3'

    je veux extraire automatiquement mes paramètres par1, par2, par3.. sachant que chaque paramètre commence par un '%' et se termine
    - ou par un '&'
    - ou par un '%'
    - ou par un ''(chaine vide)

    g chopé cette méthide sur le forum:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    procedure extraireMots(s : string; into : TStrings;
                     viderListe : boolean = false; sep : TSysCharSet = ['%' , '&']);
    var 
      i, n : integer;
      currentWord : string; 
    begin 
      if viderListe then
        into.Clear;
      n := length(s);
      i := 1;
     
      try
      while (i <= n) do
      begin
        currentWord := '';
        { on saute les séparateurs  }
        while (i <= n) and (s[i] in sep) do
          inc(i);
        { récupération du mot courant  }
        while (i <= n) and not (s[i] in sep) do
        begin
          currentWord := currentWord + s[i];
          inc(i);
        end;
        if (currentWord <> '') then
          into.Add(currentWord);
      end;
      except
        on e:Exception do
          ShowMessage(e.Message);
      end;
    end;
    cette fonction marche nickel.. mais g pas su l'adapter à mon code

    qqn a til une idée?.. merci

  2. #2
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    g trouvé ça sur le forum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function extraire_chaine(chaine,debut,fin:string):string;
    var
     resultat:string;
     begin
    resultat :=copy(chaine,Pos(debut,chaine)+length(debut),length(chaine));
    resultat := copy(resultat,0,Pos(fin,resultat)-1);
    result := resultat;
    end;
    donc quand je fais par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    param1 := extraire(MyString, '%', '&')
    ça m'affiche bien par1.

    mais comment écrire l'algo de mon pb?? merci..

  3. #3
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Bonjour repart à chaque fois de ta nouvelle chaîne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    type 
    TString = array of string;
     
    function extraire_chaine(chaine,debut,fin:string):Tstring;
    var
     sep1, sep2,taille : integer;
      resultat:string;
      retour : TString;
     
     begin
    taille := 0;
     
    While ( fin de ta chaine ) do // a toi d'ecrire ta condition, lier au renvoi de la valeur de pos (aide F1) lorsqu'elle trouve rien (j'ai pas Delphi sur moi la...)
      sep1 = pos('%',chaine);
      sep2= pos('&',chaine);
      resultat :=copy(chaine,pos1,pos2);
      taille := taille+1;
      setlength(retour,taille);
      retour[taille-1]:=resultat;
      chaine := copy(chaine,pos2,fin);
    end;
     
      result := retour;
    end;
    J'espère que ca t'aideras

  4. #4
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    marci deja de ta réponse...

    g essayé de bidouiller ton code..
    d'abord, à quoi sert début et fin?
    et puis, la méthode copy attend des indexes et pas des strings..

    ensuite, je ne sais pas si les caractères % et & sont alternés comme tu le supposes dans le code..

  5. #5
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    debut et fin ne servent à rien, c'est juste une reprise de ton code...

    Concernant les séparateurs, je suis pa un expert du Delphi, mais tu pourrais faire un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    sep1 = pos('%',chaine);
     sep2= pos('&',chaine);
    if sep1>sep2 then sepDepart := sep2 else sepDepart := sep1;
     chaine := copy(chaine,pos2,length(chaine));  // recreation de ta chaine a partir de ton premier separateur
      sep1 = pos('%',chaine);
     sep2= pos('&',chaine);
    if sep1>sep2 then sepArrivee := sep2 else sepArrivee := sep1;
    
      resultat :=copy(chaine,sepDepart,sepArrivee);
     taille := taille+1;
      setlength(retour,taille);
      retour[taille-1]:=resultat;
      chaine := copy(chaine,sepArrivee,length(chaine));
    Après y a surement moyen de faire mieux...

  6. #6
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    bon, j'ai réussi avec ça..
    je vous le file au cas ou ça intéresserait qqn...



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    begin
    myString := 'ab=%par1%par2&xxxx%par3'
     
    lstParam := TStringList.Create;
     
    for i := 0 to Length(myString)- 1 do
    begin
    if myString [i]= '%' then
      begin
        temp_myString  := copy(myString, i, Length(myString ));
        k:= pos('%', copy(myString , i+1, Length(myString )))-1;
        h:= pos('&', temp_myString );
     
        if (k<=0)And (h>0) then min :=h
        else
          if (h<=0)And (k>0) then min:=k
            else
              if (k<=0)And (h<=0) then min := 0
                else min:= Math.Min(k, h);
     
        if min = 0 then
          lstParam.Add(droite(myString[i], temp_myString ))
            else
              lstParam.Add(extraire_chaine(tempmyString, myString[i], temp_myString[min]));
      end;
    end;
    tout en rappelant que:
    - extraire_chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // extraire une sous-chaine (result) entre 2 autres chaines (ou séparateurs : début et fin) dans une même chaine (chaine)
    function extraire_chaine(chaine,debut,fin:string):string;
    var
     resultat:string;
     begin
    resultat :=copy(chaine,Pos(debut,chaine)+length(debut),length(chaine));
    resultat := copy(resultat,0,Pos(fin,resultat)-1);
    result := resultat;
    end;
    et que droite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    /// fonction qui renvoie la sous-chaine située à droite de la sous-chaine substr dans la chaine s
    function droite(substr: string; s: string): string;
    begin
      if pos(substr,s)=0 then result:='' else
        result:=copy(s, pos(substr, s)+length(substr), length(s)-pos(substr, s)+length(substr));
    end;

    Pourvu que ça plaise

    Le résultat si on fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for I := 0 to lstParam.Count - 1 do
      ShowMessage(lstParam[i]);
    on aura successivement:
    par1
    par2
    par3

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Extraire des données à partir d'une ontologie
    Par sarahm dans le forum SPARQL
    Réponses: 2
    Dernier message: 12/04/2012, 17h01
  2. Réponses: 2
    Dernier message: 28/03/2008, 19h24
  3. [Tableaux] Extraire des mots d'une chaine de caractères
    Par pratiquement dans le forum Langage
    Réponses: 5
    Dernier message: 24/01/2008, 10h20
  4. Réponses: 5
    Dernier message: 07/05/2007, 09h16
  5. [VBA-E] extraire des données à partir d'une autre feuille
    Par zzman dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/01/2007, 14h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo