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 :

Détecter la forme d'une ligne dans un TStringList ?


Sujet :

Delphi

  1. #1
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 472
    Points : 262
    Points
    262
    Par défaut Détecter la forme d'une ligne dans un TStringList ?
    Bonjour,

    Je traite des fichiers dans lesquels une ligne me pose problème...
    En effet, elle peut avoir plusieurs formes différentes et par conséquent le traitement s'en trouve modifié...

    Je souhaite récupérer la direction et la force en KT.

    Je pense que l'utilisation des expressions régulières pourraient me simplifier la vie mais je ne sais pas comment les utiliser avec Delphi.

    Voici un exemple de ligne que je peux avoir :
    Wind: from the NNW (340 degrees) at 5 MPH (4 KT):0
    Wind: from the N (360 degrees) at 6 MPH (5 KT):0
    Wind: from the NE (040 degrees) at 5 MPH (4 KT):0
    Wind: from the NNE (030 degrees) at 5 MPH (4 KT):0
    Wind: from the NE (050 degrees) at 6 MPH (5 KT):0
    Wind: Calm:0
    Wind: from the E (090 degrees) at 3 MPH (3 KT):0
    Wind: Variable at 2 MPH (2 KT):0
    Actuellement j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // Vent (direction/vitesse)
    for i := 0 to MyStringList.Count-1 do
    begin
         if Pos('Wind:',MyStringList.Strings[i]) > 0 then
         begin
              MyVentDirection := StrToInt(Trim(Copy(MyStringList.Strings[i],Pos('(',MyStringList.Strings[i])+1,3)));
              s := MyStringList.Strings[i];
              Delete(s,1,Pos(')',s));
              MyVentVitesse := SimpleRoundTo(StrToInt(Trim(Copy(s,Pos('(',s)+1,2)))*(1/0.54),-2);
              break;
         end;
    end;
    Pensez-vous que les expressins régulières sont à utiliser dans ce cas ou alors faut-il utiliser des "if, then et else" ?

    Merci d'avance,
    Mathieu

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Si la syntaxe est simple (pas d'imbrication), les "if then else" conviennent.

    Toutefois, il faudrait d'abord faire un découpage en mots avant analyse du contenu.

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Wind: Variable at 2 MPH (2 KT):0 ==>
    Wind
    :
    variable
    at
    2
    MPH
    (
    2
    KT
    )
    :
    0

  3. #3
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 472
    Points : 262
    Points
    262
    Par défaut
    Bonjour,

    J'ai fouillé sur le site et j'ai trouvé un exemple (http://delphi.developpez.com/faq/?page=regex) que j'ai transformé en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TFPrincipale.Button1Click(Sender: TObject);
    var
         Masque    : string;
    begin
         Masque := 'Wind: from the * (* degrees) at * MPH (* KT):0';
         if MatchesMask(Edit1.Text,Masque) then
              Edit2.Text := 'OK!'
         else
              Edit2.Text := 'ERREUR!';
    end;
    Je trouve que ça simplifie les tests, non ?

    Qu'en pensez-vous ?

    Merci,
    Mathieu

  4. #4
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    MatchesMask

    Connais pas!
    C'est génial

  5. #5
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 472
    Points : 262
    Points
    262
    Par défaut
    Salut,

    Oui, regarde l'exemple que j'ai fais :
    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
     
    procedure TFPrincipale.Button1Click(Sender: TObject);
    var
         Masque    : string;
    begin
         Masque := 'Wind: from the * (* degrees) at * MPH (* KT):0';
         if MatchesMask(Edit1.Text,Masque) then
         begin
              Edit2.Text := '1 -> OK!'
              // Traitement cas 1...
         end
         else
         begin
              Masque := 'Wind: Variable at * MPH (* KT):0';
              if MatchesMask(Edit1.Text,Masque) then
              begin
                   Edit2.Text := '2 -> OK!'
                   // Traitement cas 2...
              end
              else
              begin
                   Edit2.Text := 'ERREUR !';
                   // Traitement si non trouvé...
              end
         end;
    end;
    Je rentre ces données :
    Wind: Variable at 2 MPH (2 KT):0
    Wind: from the NNW (340 degrees) at 5 MPH (4 KT):0
    L'avantage, c'est que je peux avoir :
    Wind: from the NNW (3 degrees) at 475 MPH (674 KT):0
    ou
    Wind: from the N (340 degrees) at 5 MPH (4 KT):0
    Il détecte la forme de ma chaine et la valide ^^

    Cordialement,
    Mathieu

  6. #6
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Excellent le MatchesMask, je retiens.

    Il ne manque plus qu'une extension de cette fonction qui mettrait dans une Tstringlist les mots qui remplacent les "*" du masque.

  7. #7
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 472
    Points : 262
    Points
    262
    Par défaut
    Bonjour,

    Je n'ai plus qu'à développer e traiteent adéquat pour chaque type de ligne

    Cordialement,
    Mathieu

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/04/2008, 13h16
  2. Détecter l'ajout d'une ligne dans une table
    Par louis_figos dans le forum Access
    Réponses: 2
    Dernier message: 07/12/2006, 17h31
  3. copier une ligne dans une autre table
    Par BoeufBrocoli dans le forum SQL
    Réponses: 5
    Dernier message: 24/10/2003, 22h59
  4. Supprimer une ligne dans un fichier
    Par sbeu dans le forum Langage
    Réponses: 3
    Dernier message: 13/05/2003, 10h30
  5. Déplacer la sélection d'une ligne dans un stringgrid
    Par jer64 dans le forum Composants VCL
    Réponses: 5
    Dernier message: 14/03/2003, 00h57

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