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 :

Recherche de caractères


Sujet :

Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2016
    Messages : 73
    Points : 41
    Points
    41
    Par défaut Recherche de caractères
    bonjour,


    Nom : Capture.PNG
Affichages : 595
Taille : 14,6 Ko

    procedure Tfficheve.btnEnvoyerClick(Sender: TObject);

    var
    i : integer;
    j: integer;
    phrase : string;

    begin

    Memo4.Lines.LoadFromFile('test.txt');
    phrase:='';
    for i := 0 to memo4.Lines.Count-1 do
    begin
    if Memo4.Lines.Text ='08:00' then

    phrase:= copy(memo4.Lines[i],27,75);
    memo1.Lines[i]:=phrase;
    Memo1.Lines.Add(IntToStr(j));
    end;
    end;
    En cliquant sur le bouton, je charge un fichier dans le mémo de gauche. J'aimerais que chaque fois qu'il y a, dans une ligne "'08:00'", cette ligne (et uniquement cette ligne) soit copiée dans l'autre mémo. Mais il doit y avoir quelque chose qui ne va pas dans mon code car ça ne donne pas le résultat obtenu... .

    D'avance merci

  2. #2
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Bonjour,
    peux tu donner un exemple de fichier test.txt ?

    je pense que c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       if Memo4.lines.text = '08:00' Then ...
    qui ne va pas, car Memo4.lines.text ne contient pas que cela ?
    A+
    Charly

  3. #3
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2016
    Messages : 73
    Points : 41
    Points
    41
    Par défaut
    Nouveau document texte.txt

    voici un exemple. Dans la réalité, c'est avec bcp plus de lignes mais c'est trop gros pour l'envoyer.

    Oui, le problème doit venir de là, car j'avais vu que ça fonctionnait quand je ne mettais que "08:00". Donc c'est bien la recherche de "08:00" dans chacune de lignes qui ne fonctionne pas mais là je vois pas trop

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if Pos('08:00', Memo4.Lines[i])>0 then 
    begin
      phrase:= copy(memo4.Lines[i],27,75);
      memo1.Lines[i]:=phrase; // ???
      Memo1.Lines.Add(IntToStr(j)); // ???
    end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2016
    Messages : 73
    Points : 41
    Points
    41
    Par défaut
    memo1.Lines[i]:=phrase; // ???
    Memo1.Lines.Add(IntToStr(j)); // ???
    Avec ces deux lignes, je voulai afficher dans le memo de droite (donc pas celui qui contient tout le contenu du fichier .txt) toutes les lignes qui comprennent le '08:00'

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    s'il faut copier toutes la ligne dans memo1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var  l : string;
    ...
    for l in memo4.lines  do if Pos('08:00', Memo4.Lines[i])>0 then Memo1.Lines.Add(l));
    par contre, je dirais que l'on oublie trop souvent une bibliothèque méconnue et que l'on peut utiliser les expressions régulières pour avoir le même résultat.

    N.B. un petit test de cette expression m'a fait voir que toutes les lignes de l'échantillon avaient 08:00 ! un test avec l'expression ^.*0ABUT990102104024.*$ permet d'extraire un certains nombre de ligne à partir de ce dernier

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    // Delphi Berlin 10.1
    unit Unitreg;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.RegularExpressions;
     
    type
      TForm8 = class(TForm)
        Memo1: TMemo;
        Memo2: TMemo;
        OpenDialog1: TOpenDialog;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form8: TForm8;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm8.Button1Click(Sender: TObject);
    var Reg : TRegEx;
        l : String;
    begin
    if opendialog1.Execute then
      begin
        memo1.Clear;
        memo2.Clear;
        memo1.Lines.LoadFromFile(Opendialog1.FileName);
        Reg:=Tregex.Create('^.*0ABUT990102104024.*$'); // avantage, l'expression peut être une variable saisie dans un TEdit 
        for l in memo1.Lines do
          if Reg.IsMatch(l) then memo2.Lines.Add(l);
      end;
    end;
     
    end.
    beaucoup s'arrêteront à l'utilisation de pos , mais quant il s'agira de recherches plus complexes les expressions régulières restent fort utiles
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Bonjour,

    sans modifier beaucoup ton code :

    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 Tfficheve.btnEnvoyerClick(Sender: TObject);
    Var
      i      : Integer;
      phrase : String;
    Begin
      Memo4.Lines.LoadFromFile('test.txt');
      phrase:='';
      for i := 0 to Memo4.Lines.Count-1 do
        begin
          if Pos('08:00', Memo4.Lines[i])>0 then 
            begin
              phrase:= copy(Memo4.Lines[i],27,75);
              Memo1.Lines.Add(Phrase); // ou Memo1.Lines.Add(Memo4.Lines[i]); ?? selon ce que tu veux
            End ;
        End;
    End;
    A+
    Charly

  8. #8
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2016
    Messages : 73
    Points : 41
    Points
    41
    Par défaut
    D'accord, merci. Je comprends vos codes et ce qui ne fonctionnait pas dans le mien.

    Par contre, pour éviter d'ouvrir un autre sujet, pourriez-vous me dire comment pour ceci : Dans une ztable (reliée correctement avec un datasource et une base de données access), j'ai un champ nommé "nom_produit" puis d'autres avec "code1", "code2", "code3". Les chiffres qui sont récupérés entre les caractères 102 et 109 de chacune des lignes (grâce au copy(Memo4.Lines[i],27,75) correspondent en réalité au code d'un produit. Ce produit est dans une base de données access. J'aurai voulu afficher le nom du produit en lieu et place du code du produit.

    Donc, dans le mémo1, j'ai par exemple

    aderwel, Yvonne Marie Yvonne19080505655 00007-01 1939-01-01 Dupire 0ABUT990102104024 0A08:00 16031773260536100 RESIDENCE Edel 00007-01
    aderwel, Yvonne Marie Yvonne19080505655 00007-01 1939-01-01 Dupire 0ABUT990102104024 0A08:00 16031873260536100 RESIDENCE Edel 00007-01
    aderwel, Yvonne Marie Yvonne19080505655 00007-01 1939-01-01 Dupire 0ABUT990102104024 0A08:00 16031973260536100 RESIDENCE Edel 00007-01
    aderwel, Yvonne Marie Yvonne19080505655 00007-01 1939-01-01 Dupire 0ABUT990102104024 0A08:00 16032173260536100 RESIDENCE Edel 00007-01

    et j'aimerai avoir en lieu et place de ces caractères en rouge les noms présents dans la ztable

    nom_produit cnk cnk1 cnk2 ...
    cif 1485214 2547852 1258950
    samsung 2104024 2487512 7412561
    pills 2487520 1489652 5412365

    Donc ici, pour chacune des lignes, j'aurai voulu voir "samsung" plutôt que 2104024.


    Je sais déjà que je dois faire une tquery ayant pour datasource le datasource correspondant à ma base de données access.

    Pour la requête SQL, j'avais pensé à select nom_produit from tproduits where cnk = "Memo4.Lines[i],102,7";



    Après, je ne vois pas du tout ce que je devrai faire.



    d'avance merci

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par bertrantitude Voir le message
    Je sais déjà que je dois faire une tquery ayant pour datasource le datasource correspondant à ma base de données access.
    Oui
    Pour la requête SQL, j'avais pensé à select nom_produit from tproduits where cnk = "Memo4.Lines[i],102,7";
    Non, ici ce qui est recherché est un clé de valeur "Memo4.Lines[i],102,7"
    le mieux serait de faire une requête paramétrée

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT NOM_PRODUIT FROM TPRODUITS WHERE CNK=:V

    et d'utiliser ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TZQUery.Active:=False;
    TZQuery.ParamByName('V').asString:=Copy(Memo4.Lines[i],124,7); // cnk est-il un string ou un integer ? 
    TZQuery.Active:=True;
    pour obtenir TZQUery.FieldByName('NOM_PRODUIT').asString

    N.B. en utilisant la méthode avec expressions régulières, on peut extraire le code du produit pour le traiter dans la même passe que le remplissage du mémo
    et on doit même pouvoir utiliser la fonction replace de TRegEx pour faire la concaténation lire le tutoriel de Roland Chastain chapitre VI.C 2éme exemple

    NB Bis la position du produit n'est pas en 102 mais en 124 ^.{124}(.{7}).*08:00.*$
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #10
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2016
    Messages : 73
    Points : 41
    Points
    41
    Par défaut
    D'accord, merci.

    CNK est en string.


    Je ne comprends pas trop où je dois placer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TZQUery.Active:=False;
    TZQuery.ParamByName('V').asString:=Copy(Memo4.Lines[i],124,7); // cnk est-il un string ou un integer ? 
    TZQuery.Active:=True;
    pour obtenir TZQUery.FieldByName('NOM_PRODUIT').asString

    Je l'ai mis comme ça mais ça doit pas être bon :S

    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
     
    procedure Tffichevedette.btnEnvoyerClick(Sender: TObject);
     
    var
      i : integer;
      j: integer;
      phrase : string;
     
         begin
     
         Memo4.Lines.LoadFromFile('test.txt');
        phrase:='';
      for i := 0 to memo4.Lines.Count-1 do
        begin
     
       if Pos('08:00', Memo4.Lines[i])>0 then Memo1.Lines.Add(memo4.Lines[i]);
     
            ZQuery1.Active:=false;
        ZQuery1.ParamByName('V').AsString:=copy(Memo4.Lines[i],124,7);
        ZQuery1.Active:=true;
        ZQuery1.FieldByName('NOM_PRODUIT').asString;
     
        end;
    ou alors je dois mettre les trois premières lignes dans "properties" de la ztquery?

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par bertrantitude Voir le message
    Je ne comprends pas trop où je dois placer
    Je l'ai mis comme ça mais ça doit pas être bon :S
    évidemment que "ça ne doit pas être bon" puisque vous ne traitez rien !
    il manque une instruction qui remplace la chaîne recherché par la valeur trouvée et ce dans la ligne du mémo
    traduit en Pascal, la phrase ci-dessus, donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memo4.lines[i]:=StringReplace(memo4.lines[i],copy(Memo4.Lines[i],124,7),ZQuery1.FieldByName('NOM_PRODUIT').asString,[])
    cependant si cette même séquence de chiffre se retrouve ailleurs (position<124) dans la ligne le résultat ne sera pas bon

    d'où ma suggestion de passer par les expressions régulières et la fonction replace de celles-ci

    voici un exemple avec les expressions régulières
    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
    34
    35
    36
    37
    38
    39
    40
     
    // Utilisation de ZEOSDBO
    Uses ....  System.RegularExpressions ...
    ....
    procedure TForm8.Button1Click(Sender: TObject);
    var Reg : TRegEx;
         rechercher : String;
         l,Sr : String;
         ZQuery : TZReadOnlyQuery; // création de la Query au runtime
    begin
    if opendialog1.Execute then
      begin
        memo1.Clear;
        memo2.Clear;
        ZQuery:=TZReadOnlyQuery.Create(nil);
        try 
          ZQuery.Connection :=ZConnection;
          ZQuery.SQL.Text:='SELECT NOM_PRODUIT FROM TPRODUITS WHERE CNK=:V';
          ZQuery.Prepare;
          memo1.Lines.LoadFromFile(Opendialog1.FileName);
          if length(Edit1.Text)=0
           then  rechercher:='^.*08:00.*$'    // pattern par défaut (selon post #1) 
           else rechercher:=edit1.Text;          // autre pattern de recherche 
           Reg:=Tregex.Create(rechercher);
          for l in memo1.Lines do
            if Reg.IsMatch(l) then
            begin
              sr:=l;
           // ajouter la recherche TZQuery 
              TZQuery.ParamByName('V').asString:=Copy(l,124,7);
              TZQuery.Active:=True;
             sr:=Reg.Replace(l,'^(.{124})'+Copy(l,124,7)+'(.*)$','$1'+TZQUery.FieldByname('NOM_PRODUIT').asString+'$2');  
             memo2.Lines.Add(sr);
             TZQUery.Active:=False;
           end;
        finally
          ZQuery.Free;
        end;
      end;
    end;

    ou alors je dois mettre les trois premières lignes dans "properties" de la ztquery?
    je ne comprend pas cette question

    N.B. un TZQUery.Prepare avant le traitement sera un plus

    [Edit] en relisant, j'ai vu qu'il y avait un ZTable , dans ces conditions la Query est inutile et un ZTable.Locate('CNK',Copy(l,124,7),[]) doit faire l'affaire
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  12. #12
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2016
    Messages : 73
    Points : 41
    Points
    41
    Par défaut
    ok ça fonctionne correctement. J'ai clos le topic, mais il doit avoir un petit détail qui cloche ci-dessous. Je voulais que si la ligne est identique à celle du dessous, elle ne soit pas copiée. Pourriez-vous me dire ce qui va pas?

    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
    procedure TFquatre.btnEtape2Click(Sender: TObject);
    var i:integer ;
    begin
      for i := 0 to memo3.Lines.Count-1 do
      begin
     ZQuery2.Active:=false;
        ZQuery2.ParamByName('V').AsString:=copy(Memo3.Lines[i],127,7);
        ZQuery2.Active:=true;
       memo3.lines[i]:=StringReplace(memo3.lines[i],copy(Memo3.Lines[i],127,7),ZQuery2.FieldByName('NOM_PRODUIT').asString,[]);
    
     end;
        begin
    
          memo1.lines[i]:=copy(Memo3.Lines[i],1,30)+ '     '+ copy(Memo3.Lines[i],127,25);
    
    
          for i := 0 to memo3.Lines.Count do
          begin
             if Memo3.Lines[i] <> Memo3.Lines[i+1] then
             begin
    
          Memo1.Lines.Add(Memo3.Lines[i]);
    
             end;
          end;
        end;
    
    end;

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par bertrantitude Voir le message
    Je voulais que si la ligne est identique à celle du dessous, elle ne soit pas copiée. Pourriez-vous me dire ce qui va pas?
    1-le test n'est pas au bon endroit

    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 TFquatre.toutClick(Sender: TObject);
    var i:integer ;
    begin
      // chargement de memo1
      for i := 0 to memo1.Lines.Count-1 do
      begin
       if (i>0) AND (memo1.lines[i-1]<>memo1.lines[i]) then
       begin 
       ZQuery2.Active:=false;
       ZQuery2.ParamByName('V').AsString:=copy(Memo1.Lines[i],127,7);
       ZQuery2.Active:=true;
       memo3.lines[i]:=StringReplace(memo1.lines[i],copy(Memo3.Lines[i],127,7),ZQuery2.FieldByName('NOM_PRODUIT').asString,[]);
       end;
     end;
     
    end;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  14. #14
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2016
    Messages : 73
    Points : 41
    Points
    41
    Par défaut
    D'accord, merci.

    Avec ceci, j'ai essayé de ne comparer que les 50 premiers caractères de chaque ligne, mais je ne parviens pas à trouver la solution. Actuellement, le code compare la ligne dans son entièreté.
    Est-ce que, comme je le pense, il serait possible de faire qqe chose comme list1:=(copy... ?

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    procedure CompareStringLists(List1, List2 : TStringList; Missing1, Missing2, Common1 : TStrings);
      var
        I: Integer;
        J: Integer;
      begin
        List1.Sort;
        List2.Sort;
        I := 0;
        J := 0;
     
        while (I < List1.Count) and (J < List2.Count) do
        begin
          if List1[I] < List2[J] then
          begin
            Missing2.Add(List1[I]);
            Inc(I);
          end
          else if List1[I] > List2[J] then
          begin
            Missing1.Add(List2[J]);
            Inc(J);
          end
          else
          begin
            Common1.Add(List2[J]);
            Inc(I);
            Inc(J);
          end;
        end;
        for I := I to List1.Count - 1 do
          Missing2.Add(List1[I]);
        for J := J to List2.Count - 1 do
          Missing1.Add(List2[J]);
      end;
     
    var
      List1: TStringList;
      List2: TStringList;
     
      TickStart, TickEnd: TLargeInteger;
      TickPerSec: TLargeInteger;
     
    begin
     
             btnreset.Visible := true;
             btnSave.Visible := true;
     
      QueryPerformanceFrequency(TickPerSec);
     
      List1 := TStringList.Create;
      List2 := TStringList.Create;
      try
     
        QueryPerformanceCounter(TickStart);
     
        Memo3.Lines.BeginUpdate();
        Memo4.Lines.BeginUpdate();
        Memo5.Lines.BeginUpdate();
     
        List1.Clear();
        List2.Clear();
        Memo3.Lines.Clear();
        Memo4.Lines.Clear();
        Memo5.Lines.Clear();
     
        List1.LoadFromFile(OpenDialog1.FileName);
        List2.LoadFromFile(OpenDialog2.FileName);
     
        CompareStringLists(List1, List2, Memo3.Lines, Memo4.Lines, Memo5.Lines);
     
        Memo5.Lines.EndUpdate();
        Memo4.Lines.EndUpdate();
        Memo3.Lines.EndUpdate();
     
        QueryPerformanceCounter(TickEnd);
      //  ShowMessage(Format('Avec BeginUpdate - %d ms', [Trunc((TickEnd - TickStart) / TickPerSec * MSecsPerSec)]));
     
      finally
        List2.Free;
        List1.Free;
      end;
    end;
     
    procedure TFFicheComparaison.btnOkNewClick(Sender: TObject);
     
     var
        Filename:string;
        fichier1: TextFile;
           begin
     
            OpenDialog1.Execute;
            AssignFile(fichier1,OpenDialog1.FileName);
            Edit2.Text := OpenDialog1.FileName;
    end;

  15. #15
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour,


    Actuellement, le code compare la ligne dans son entièreté.
    je tique sur "dans son entièreté", avec "bravitude" je propose plutôt d'écrire totale

    Est-ce que, comme je le pense, il serait possible de faire qqe chose comme list1:=(copy... ?
    bien évidement.

    encore des complications inutiles dans le code

    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
     
          if List1[I] < List2[J] then
          begin
            Missing2.Add(List1[I]);
            Inc(I);
          end
          else if List1[I] > List2[J] then
          begin
            Missing1.Add(List2[J]);
            Inc(J);
          end
          else
          begin
            Common1.Add(List2[J]);
            Inc(I);
            Inc(J);
          end;
        end;
    cette partie peut être avantageusement remplacée en utilisant la fonction CompareText

    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
    34
    35
    36
     
    uses math ....
     
    var rc : Integer;   // résultat de la comparaison pour détailler le code 
         plist1, plist2 : String; // partie de ligne
         I: Integer;
         J: Integer;
      begin
        List1.Sort;
        List2.Sort;
        I := 0;
        J := 0;
     
        while (I < List1.Count) and (J < List2.Count) do
        begin
     
           plist1:=copy(list1[i],0,50);
           plist2:=copy(list2[j],0,50);
     
           rc :=Comparetext(pList1, pList2);                           /// <<< inutile en utilisant  case Signe(Comparetext(pList1, pList2)) of 
           case Sign(rc) of    // utilisation de Math.Sign pour obtenir 0,1,-1 selon le signe 
             0  : begin  // égalité
                    Common1.Add(List2[J]);
                    Inc(I);
                    Inc(J);
                  end;
            1  : begin // plist1> plist2
                    Missing1.Add(List2[J]);
                    Inc(J);
                 end;
          -1 : begin // plist1< plist2
                   Missing2.Add(List1[I]);
                   Inc(I);
               end;
       end; // end case 
    end; // fin de boucle
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

Discussions similaires

  1. Recherche de caractère
    Par reggae dans le forum C++
    Réponses: 5
    Dernier message: 03/01/2006, 12h35
  2. Recherche de caractères spéciaux
    Par sberube dans le forum Langage
    Réponses: 1
    Dernier message: 18/11/2005, 20h41
  3. [FPDF] Recherche chaine caractères dans fichier pdf
    Par licorne dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 28/10/2005, 11h55
  4. recherche de caractères non_lettres dans chaine
    Par niconoe dans le forum Requêtes
    Réponses: 4
    Dernier message: 12/09/2005, 08h54
  5. []recherche chaine caractère partielle
    Par cd090580 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 11/09/2005, 14h15

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