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 :

Supprimer les lignes ne contenant pas un ou plusieurs mots (TStringList)


Sujet :

Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 108
    Points : 82
    Points
    82
    Par défaut Supprimer les lignes ne contenant pas un ou plusieurs mots (TStringList)
    Bonjour à tous,

    Alors voilà, je cherche à supprimer les lignes d'un StringList ne contenant pas un ou plusieurs mots.
    En gros : si Ligne1 ne contient pas Mot1, Mot2 ou Mot3, alors poubelle.

    L'inverse est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      for i := Datas.Count - 1 downto 0 do
        for j := List.Count - 1 downto 0 do
          if AnsiContainsText(Datas[i], List[j]) then
            Datas.Delete(i);
    Datas étant la liste à nettoyer.
    List étant la liste d'exclusions (peut contenir 1 comme 1000 mots).

    Alors évidement if not ne fonctionne pas...
    Car la boucle ne tourne pas jusqu'au bout (si le premier mot n'est pas trouvé alors il Delete, sans chercher les autres mots).

    En fait c'est exactement ce système (de l'excellent TextMechanic) : http://textmechanic.com/Remove-Lines...ontaining.html

    Merci par avance

    Beny

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Tu n'es pas loin du résultat, il fallait juste ajouter une rupture de la boucle, via une fonction, c'est bien plus simple à écrire !

    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
    ...
      for i := Datas.Count - 1 downto 0 do
        if not ContainsTexts(Datas[i], List) then
          Datas.Delete(i); 
    ...
     
    function ContainsTexts(const S: string; Texts: TStrings): boolean;
    var
      i: integer;
    begin
      Result := True;
     
      for i := 0 to Texts.Count - 1 do
        if AnsiContainsText(S, Texts[i]) then
          Exit;
     
      Result := False;
    end;
    Il existe aussi AnsiMatchText utilisant un Array of string


    Voici la version SANS fonction et un vilain break

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      for i := Datas.Count - 1 downto 0 do
      begin
        Exists := True; // ou False, c'est juste si List est vide
     
        for j := 0 to List.Count - 1 do
        begin
          Exists := AnsiContainsText(Datas[i], List[j]);
          if Exists then
            break;
        end;
     
        if not Exists then
          Datas.Delete(i); 
      end;




    Citation Envoyé par benymypony Voir le message
    Alors évidement if not ne fonctionne pas...
    Car la boucle ne tourne pas jusqu'au bout (si le premier mot n'est pas trouvé alors il Delete, sans chercher les autres mots).
    Que ce soit if ou if not, ta boucle provoquera une erreur !

    Sinon dans ta boucle if, tu risquais surtout des dépassement d'index !

    Datas contient
    Mot1
    Mot2
    Mot3

    List contient
    Mot1
    Mot2
    Mot3

    Itération i = 2, j = 2 -> Mot1 est présent, suppression de 2
    Itération i = 2, j = 1 -> Index Hors Limite !



    Si tu avais fait if not

    Datas contient
    Mot1
    Mot2
    Mot3

    List contient
    Mot4
    Mot5
    Mot6

    Itération i = 2, j = 2 -> Mot4 n'est pas présent, suppression de 2
    Itération i = 2, j = 1 -> Index Hors Limite !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 108
    Points : 82
    Points
    82
    Par défaut
    Mille merci, ta fonction fonctionne parfaitement

    Effectivement j'avais des erreurs qui survenaient parfois.
    Il fallait donc plutôt que je mélange for downto do avec for to do, si j'ai bien compris.

    Beny

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

Discussions similaires

  1. Comment supprimé les lignes n'ayant pas 12 caractères
    Par chris1293 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/06/2014, 17h10
  2. [RegEx] Trouver les lignes ne contenant pas une expression
    Par venturi dans le forum Langage
    Réponses: 6
    Dernier message: 14/08/2013, 17h52
  3. [RegEx] [PCRE] Trouver les lignes ne contenant pas un mot
    Par NinjDS dans le forum Langage
    Réponses: 8
    Dernier message: 14/05/2012, 16h28
  4. [XL-2007] Macro, pour supprimer les lignes contenant « #REF! »
    Par LittleDaddy dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/01/2011, 00h05

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