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

Langage Delphi Discussion :

Découper une chaîne de caractères


Sujet :

Langage Delphi

  1. #1
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut Découper une chaîne de caractères
    Bonjour,

    J'ai un problème simple : découper une chaine de caractère à chaque saut de ligne. Par contre la solution l'est beaucoup moins
    Voici ce que j'ai fait :
    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
    procedure TForm1.foo;
    var
      query: TStringList;
    begin
      query := TStringList.Create;
      Split (chr (10), GetQueryString, query);
    end;
     
    procedure TForm1.Split (const Delimiter: Char; Input: string; const Strings: TStrings);
    begin
      Assert (Assigned(Strings));
      Strings.Clear;
      Strings.Delimiter := Delimiter;
      Strings.DelimitedText := Input;
    end;
    Le problème c'est que la chaine est découpée à chaque espace

    La chaîne à découper provient d'un fichier récupéré via TIdHTTP (par l'intermédiaire de la fonction GetQueryString).

    Bien sûr j'ai vérifié que les sauts de lignes étaient bien composés uniquement du caractère 0x0A, que la propriété QuoteChar de ma TString ne correspondait pas à une espace et que les espaces ne correspondent pas au caractère 0x0A (au point ou j'en suis, on ne sais jamais ).

  2. #2
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Pour éviter ça, il faudrait encadrer chaque chaine avec des " par exemple.

    Personnellement, j'utilise la fonction de la FAQ :

    http://delphi.developpez.com/faq/?pa...chaine#explode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.foo;
    var
      query: TStringList;
    begin
      query := TStringList.Create;
      extraireMots(GetQueryString,query,true,[#10]);
    end;
    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Bloon
    Pour éviter ça, il faudrait encadrer chaque chaine avec des " par exemple.
    C'est dû quoi ? C'est la classe TString qui découpe obligatoirement après chaque espace en plus du délimiteur fourni ?

    Citation Envoyé par Bloon
    Personnellement, j'utilise la fonction de la FAQ :

    http://delphi.developpez.com/faq/?pa...chaine#explode
    Je ne l'ai pas vu celle là ça fonctionne très bien


  4. #4
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Citation Envoyé par gege2061
    C'est dû quoi ? C'est la classe TString qui découpe obligatoirement après chaque espace en plus du délimiteur fourni ?
    Oui, d'après l'aide de Delphi :

    En écriture de DelimitedText, il faut séparer les chaînes individuelles en utilisant des QuoteChar aux deux extrémités, en utilisant Delimiter comme séparateur, ou en utilisant ces deux méthodes.
    En regardant le code de TStrings.SetDelimitedText (unité Classes) il semble considérer les caractères de #1 à ' ' comme étant des séparateurs.

    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Bloon
    En regardant le code de TStrings.SetDelimitedText (unité Classes) il semble considérer les caractères de #1 à ' ' comme étant des séparateurs.
    Suffit de la savoir.

    Encore merci pour ton aide

  6. #6
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Salut!

    Perso, j'obtiens de meilleures résultats avec le code suivant.
    La principale différence, c'est qu'il prend en compte les éléments vides.

    Par exemple, si le délimiteur est * et que l'on traîte la chaîne 'Salut*comment**ça va*?*', la fonction retournera 5 éléments contre 4 avec le code de la faq...
    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
    Procedure StrExplode(Const s, sep: String; list: TStrings);
    Var x, l: Integer;
        st: String;
    Begin
      l := Length(s);
      If (l <= 0) Then Exit;
      x := 1;
      st := '';
      Repeat
        If (s[x] = sep) Then Begin
          list.Add(st);
          st := '';
        End Else st := st + s[x]; 
        inc(x);
      Until (x > l);
    End;
    à+
    De retour parmis vous après 10 ans!!

  7. #7
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 17
    Points : 19
    Points
    19
    Par défaut petite fonction
    Etant donné que Delphi ne propose pas de substr(), voici la fonction que j'ai préparé (désolé si je fais remonter ce sujet, je suis tombé dessus en recherchant une fonction du langage) :

    Comme je n'ai pas trouvé cette fonction (pourtant banale) avec ces parametres, je me permet de vous la soumettre, si cela peut aider certains débutants qui se tirent les cheveux .

    Merci.

    @param :
    posdeb : indice de départ de la découpe (inclu)
    posfin : indice de fin (inclu)
    chaine : chaine à découper.

    @retour
    renvoie une chaine String extraite de la chaine passée en paramètre.

    [edition]
    jrajoute la gestion d'erreur tout de même
    [/edition]

    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
    function TForm1.substr(posdeb: integer; pos_fin: integer; chaine: string): string;
    var
      new_chaine: string;
      i: integer;
    begin
      new_chaine := '';
      if ((length(chaine)+1) > pos_fin) then // je ne sais plus si Delphi gère le >=
      begin
         for i:= posdeb to pos_fin do
         begin
           new_chaine := new_chaine + chaine[i];
         end;
      end
      else new_chaine := chaine; // on lui renvoie sa propre chaine en cas d'erreur.
      Result := new_chaine;
    end;

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Je pense que la fonction Copy native de Delphi répond à ton besoin (bien qu'au lieu de passer un index de fin tu doives passer un nombre de caractères à recopier).
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  9. #9
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 17
    Points : 19
    Points
    19
    Par défaut erf
    Citation Envoyé par Aka Guymelef Voir le message
    Je pense que la fonction Copy native de Delphi répond à ton besoin (bien qu'au lieu de passer un index de fin tu doives passer un nombre de caractères à recopier).
    Mdr . En plus j'la connaissais cette fonction .

    Ca faisait longtemps que j'avais pas utilisé Delphi. Ca m'apprendra à avoir mal recherché, na !

    merci bien ^^.

    (d'autant plus que je ne gère pas l'erreur de dépassement de l'index. Dans le cas de mon utilisation, cette erreur ne peut se produire . encore merci)

  10. #10
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Attention, certaines méthodes sont plus performantes que d'autres... Il y avait ce sujet où les membres ont comparé les temps de traitement des différentes solutions pour le découpage d'une chaîne. Le code que je t'ai donné est le plus rapide que j'ai pu trouver. C'est important si tu as beaucoups de texte à traîter...
    De retour parmis vous après 10 ans!!

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

Discussions similaires

  1. Découper une chaîne de caractères
    Par Mr. Sandwich dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2007, 22h31
  2. [Tableaux] Découper une chaîne de caractères
    Par mix_35 dans le forum Langage
    Réponses: 5
    Dernier message: 17/03/2007, 02h06
  3. Découper une chaîne de caractères
    Par The Lord of Nesquik dans le forum C
    Réponses: 5
    Dernier message: 04/02/2007, 00h20
  4. [VBA-E] découper une chaîne de caractère
    Par jagwar dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/07/2006, 14h07
  5. Comment découper une chaîne de caractères en VBA
    Par TomPad dans le forum Access
    Réponses: 3
    Dernier message: 23/06/2005, 09h58

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