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 :

[ALGO] Explose STR


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 75
    Points : 61
    Points
    61
    Par défaut [ALGO] Explose STR
    Bonjour a vous, j'ai un petit problème d'algo.
    J'ai fait une fonction CSVtoSTRINGGRID.
    Donc elle ouvre le fichier CSV puis chaque ligne de type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Salut;Bonjour;Au revoir
    est traité dans une fonction EXPLOSE STR. Comme suis :

    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
    // Les lignes doivent se présenter comme ceci : A;B;C;D;E
    //                    => 'A' - 'B' - 'C' - 'D' - 'E'
    // Maintenant avec ceci ;;;;
    //                    => '' - '' - '' - '' - ''
    // Et avec Rien
    //                    => ''
    //                    Il renvoi tout de même une ligne vide;
    procedure ExploseStr(ch : string; var dest : TStringList; sep : string = ';');
    var
      p : integer;
    begin
    if not assigned(dest) then dest := TStringList.create;
    dest.BeginUpdate;
    dest.Clear;
    p := pos(sep, ch);
    while p > 0 do
       begin
       dest.Add(copy(ch, 1, p-1));
       if p <= length(ch) then ch := copy(ch, p + length(sep), length(ch));
       p := pos(sep, ch);
       end;
    // J'enleve cette ligne parce que sinon, il ne me renvoit pas le dernier si il est vide comme "A;B;;"
    //if trim(ch) <> '' then
       dest.Add(ch);
    dest.EndUpdate;
    end;
    Or le problème qui je rencontre sont les QUOTE des champs textes qui peuvent contenir des ;
    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Salut;"Ca va ; Oui, non ?";Bonjour
    Il va me ressortir 4 champs, normal (malheureusement).

    Je me suis donc plus penché sur le Stringlist qui peut géré ce cas avec le QUOTESTR, COMMATEXT et DELIMITEDTEXT
    Malheureusement, je n'arrive pas à réécrire ma fonction Explose car je ne traite pas un fichier mais un string. Car j'ai l'impression que c'est seulement avec un loadfromfile du stringlist qu'il active la gestion du QUOTESTR.

    Faire un ADD(S : STRING) du Tstringlist n'explose pas ma ligne mais rajoute seulement tout mon champ.

    Enfin, vous voyez mon problème.

    Donc je me doute que cela doit commencer comme ça, mais je ne sais pas écrire la suite :

    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 ExploseStr(ch : string; var dest : TStringList; sep : string = ';');
    var
      p : integer;
    begin
    if not assigned(dest) then dest := TStringList.create;
    dest.BeginUpdate;
    dest.Clear;
    dest.QuoteChar := '"';
    dest.CommaText := ';';
    dest.DelimitedText := ';';
    dest.Add(ch); // <-- Ca c'est faux Mais je trouve pas.
     
     
    dest.EndUpdate;
    end;
    J'ai vu que le JEDI a un tstringlist avec un fonction LOADFROMCSV mais je ne veux pas me pencher la dessus car ca reviendrais au même vu que je ne travaille pas à partir d'un fichier.

    Auriez-vous un idée svp.

    Merci

    Arrown

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 75
    Points : 61
    Points
    61
    Par défaut
    Ok, je crois avoir trouvé, je vais tester ça :

    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
    var
      cars : TStringList;            // Define our string list variable
      i    : Integer;
    begin
      // Define a string list object, and point our variable at it
      cars := TStringList.Create;
     
      // Now add some cars to our list - using the DelimitedText property
      // with overriden control variables
      cars.Delimiter := ' ';        // Each list item will be blank separated
      cars.QuoteChar := '|';        // And each item will be quoted with |'s
      cars.DelimitedText := '|Honda Jazz| |Ford Mondeo| |Jaguar "E-type"|';
     
      // Now display these cars
      for i := 0 to cars.Count-1 do
        ShowMessage(cars[i]);       // cars[i] equates to cars.Strings[i]
    end;
    Je marquerai résolu si ca marche

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 75
    Points : 61
    Points
    61
    Par défaut
    Ok, c'est bon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure ExploseStr(ch : string; var dest : TStringList; sep : string = ';');
    var
      p : integer;
    begin
    if not assigned(dest) then dest := TStringList.create;
    dest.BeginUpdate;
    dest.Clear;
    dest.QuoteChar := '"';
    dest.Delimiter := ';';
    dest.DelimitedText := ch;
    dest.EndUpdate;
    end;

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    le paramètre sep, il te sert à quoi ?

  5. #5
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut
    petite remarque: le var de ta TSringList est complètement inutile... Pusique comm toutes les objets Delphi, c'est un pointeur que tu manipules sans le savoir ...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 75
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Pedro204
    Salut
    petite remarque: le var de ta TSringList est complètement inutile... Pusique comm toutes les objets Delphi, c'est un pointeur que tu manipules sans le savoir ...
    Oui, effectivement, mais c'est juste pour informer le but de la procedure car on programme à plusieurs, c'est juste à titre indicatif. ;-)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 75
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Laurent Dardenne
    Salut,
    le paramètre sep, il te sert à quoi ?
    Oui, j'avais pas fini la procédure, il faut juste mettre :

    Mais il faut mettre sep : char et non string maintenant.

  8. #8
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par Pedro204
    Salut
    petite remarque: le var de ta TSringList est complètement inutile... Pusique comm toutes les objets Delphi, c'est un pointeur que tu manipules sans le savoir ...
    Si, il l'est, à cause de la première ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if not Assigned(dest) then dest := TStringList.Create;

  9. #9
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Ah bon? Mais même sans "var", ça marche ça... Je ne comprends pas...

  10. #10
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Oui, ça compile, mais la proc appelante n'aura aucun moyen de récupérer le résultat de la fonction

  11. #11
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Je ne comprends pas... Tu appelles avec le pointer qui peut être à nil... Un pointer donc... Si tu crées (alloues) la place pour la TSTringList, le pointeur renverra la bonne adresse... non? Même s'il y avait nil avant...
    Donc la procedure appelante peut bien récupérer l'instance...
    A moins que la valeur de pointer soit modifiée lors de la création de l'instance...

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 75
    Points : 61
    Points
    61
    Par défaut
    Juste pour info, la procédure que je viens de marquer ne me convient pas car avec une ligne comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    01001;A;Bonjour ca va;"Bonjour ça va"
    il va me retourner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    01001 - A - Bonjour - ca - Va - Bonjour ca va
    C'est juste a titre d'info, j'ai reprit ma proc de départ et je l'ai remanier. Je trouve que le stringlist n'assure pas sur ce coup.[/code]

  13. #13
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Et oui, il semble que la TStringList prenne l'espace comme séparateur par défaut et même s'il n'est pas spécifié...
    Mais tu peux quand même faire cette séparation facilement avec Pos et Copy non?

  14. #14
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Si tu ne t'en sors pas avec les méthodes de TStrings, utilise les différentes méthodes de la classe utilitaire StringsOps, que tu trouveras dans mon unité SjrdLists
    Ce que tu cherches en est la méthode FromString.

  15. #15
    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, je fais comme ceci, par exemple pour charger un fichier CSV dans une liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ListBox1.Items.LoadFromFile('c:\test.csv');
    ListBox1.Items.Text := AnsiReplaceStr(ListBox1.Items.Text, ';', #13);
    Autre exemple dans le même principe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Var
      Lines: TStringList;
      x: Integer;
    Begin
      Lines := TStringList.Create;
      Lines.LoadFromFile('c:\test.csv');
      Lines.Text := AnsiReplaceStr(Lines.Text, ';', #13);
      For x := 0 To Lines.Count - 1 Do
        ShowMessage(Lines[x]);
      Lines.Free;
    End;

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 75
    Points : 61
    Points
    61
    Par défaut
    Ok, merci a vous, je vais voir ton unit sjrd

    Pour Sub0 : ta première procédure ne prend pas en compte les guillement
    Donc si un champ fait "Salut;Oui" il me ferat 2 ligne or il n'en faut qu'une

  17. #17
    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
    Arf, oui en effet, j'ai oublié ce détail...
    Dans ce cas, je ne vois plus qu'une seule solution :
    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
    Procedure CSVToTList(csv: String; var Lines: TStringList);
    Var
      x: Integer;
      st: String;
      quoted: Boolean;
    Begin
      quoted := False;
      st := '';
      For x:=1 To Length(csv) Do
      Begin
        If (csv[x] = '"') Then quoted := Not quoted;
        If (csv[x] = ';') And (quoted = False) Then
        Begin
          Lines.Add(st);
          st := '';
        End Else st := st + csv[x];
      End;
    End;
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Procedure TForm1.Button1Click(Sender: TObject);
    Var
      Lines: TStringList;
      csv: String;
      x: Integer;
    Begin
      csv := '01001;A;Bonjour ca va;"Bonjour; ça va";';
      Lines := TStringList.Create;
      CSVToTList(csv, Lines);
      For x := 0 To Lines.Count - 1 Do ShowMessage(Lines[x]);
      Lines.Free;
    End;

  18. #18
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    Bonjour à vous, si ça vous intéresse, j'ai ce bout de code qui prend en compte les Délimiters et les quotes.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExploseStr('(Bonjour a vous;C'est HPAlpha);"DEV COM";DEV COM;DEV;COM', LS, ';', '"', '([{', ')]}');
    Renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    (Bonjour a vous;C'est HPAlpha)
    DEV COM
    DEV COM
    DEV
    COM
    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
    procedure ExploseStr(chaine : string; var ls : tstringlist; sep : string = ';';
    DelimiterQuote : char = '"'; DelimiterBefore : string = ''; DelimiterAfter : string = '');
    var i,nbparenthese:integer;
        mot:string;
        c:char;
        dansquote:boolean;
    begin
     if not assigned(ls) then ls := TStringlist.create;
     ls.clear;
     mot:='';
     nbparenthese:=0;
     dansquote:=false;
     for i:=1 to length(chaine) do
     begin
      c:=chaine[i];
      if pos(c, DelimiterBefore) > 0 then
       inc(nbparenthese);
      if pos(c, DelimiterAfter) > 0 then
       dec(nbparenthese);
      if c = DelimiterQuote then
       dansquote:=not dansquote;
      if (c=sep) and (nbparenthese=0) and (dansquote=false) then
      begin
       ls.add(mot);
       mot:='';
      end else
       mot:=mot+c;
     end;
    ls.add(mot);
    end;

  19. #19
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    Pour extraire des chaines, CF la fonction de la RTL: ExtractStrings.

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

Discussions similaires

  1. cherche algos Delphi pour : Huffman, R.S.A, D.E.S.
    Par X-Delphi dans le forum Débuter
    Réponses: 3
    Dernier message: 24/08/2002, 18h51
  2. Cherche l'algo crc 16 bits
    Par icepower dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 21/08/2002, 13h27
  3. Algo de calcul de FFT
    Par djlex03 dans le forum Traitement du signal
    Réponses: 15
    Dernier message: 02/08/2002, 17h45
  4. Algo de Hough et ou de Radon
    Par victorracine dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 29/07/2002, 11h09
  5. Recherche algo tree
    Par Anonymous dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 24/05/2002, 13h44

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