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 :

Recherche d'un string dans fichier.


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Points : 88
    Points
    88
    Par défaut Recherche d'un string dans fichier.
    Bonjour a tous,
    J'aimerai bien savoir si cette méthode pour rechercher un code '#S1' dans un fichier (+/- 30 Mb) et bien approprier ou existe une autre méthode qui fonctionne beaucoup plus vite pour recherche un string.


    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
     
    procedure TForm1.Button6Click(Sender: TObject);
    var
    cStream: TFileStream;
     iPos : integer;
      st: String;
    begin
      SetLength(st,5);
      cStream:= TFileStream.Create('ImgTrace.dat', fmOpenRead);
       iPos := 0;
       repeat
             cStream.Seek(iPos, soFromBeginning );
             cStream.Read(st[1],length(st) );
             inc(iPos);
      until (st = '#S1') or  (iPos >=cStream.size) ; // code a rechercher
       showmessage(inttostr(CStream.Position)); // test de sortie
       //...
       //...
      cStream.free;
     
    end;
    Merci de votre feed-back.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 522
    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 522
    Points : 25 052
    Points
    25 052
    Par défaut
    Il y a plus rapide en augmentant la taille du buffer et en évitant les va-et-vient sur le disque, ce qui complique évidemment l'algo, ... voir ma fonction SearchStringInFile
    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
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    plus simple

    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
     
    unit UUMemorySearchTxt;
     
    interface
    Uses Classes;
    Type
      TOwnEventFound = Procedure(FileName: String) of Object;
     
    TMemorySearchTxt = Class
      MyStream: TMemoryStream;
      FoundEvent : TOwnEventFound;
      Constructor Create;
      Destructor  Destroy;
      function PosString(const S, motif : string) : integer;
      Procedure Execute(FileName: String;String2Find: String);
    end;
     
    implementation
     
     
    Constructor TMemorySearchTxt.Create;
    begin
      MyStream := TMemoryStream.Create;
    end;
    Destructor  TMemorySearchTxt.Destroy;
    begin
      MyStream.Free;
    end;
     
    function TMemorySearchTxt.PosString(const S, motif : string) : integer;
    begin
      Result := Pos(motif, S);
    end;
     
    Procedure TMemorySearchTxt.Execute(FileName: String;String2Find: String);
    var
      MyString : String;
      A        : Integer;
    begin
     try
      MyStream.Clear;
      MyStream.LoadFromFile(FileName);
      SetLength(MyString, MyStream.Size);
      MyStream.ReadBuffer(Pointer(MyString)^,MyStream.Size);
      A :=  PosString(MyString,String2Find);
      If A <> 0 then
       if Assigned(FoundEvent) Then
         FoundEvent(FileName);
     except
     end;
    end;
     
    end.
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  4. #4
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Points : 88
    Points
    88
    Par défaut
    Si j'ai bien compris, augmenter le buffer, sa veut dire je copier un bloque du fichier dans la mémoire et puis je cherche le code dans la mémoire et ainsi de suite!

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    c'est tout a fait cela
    quand a mon code il met directement le fichier en mémoire pour le
    transformer en string (max 2 Go)
    tu nous as dit 30Mo donc autant se lacher


    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 522
    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 522
    Points : 25 052
    Points
    25 052
    Par défaut
    L'avantage de SearchStringInBigFile c'est quelle fonctionne sur des fichiers de 2Go (testé avec 10Go), qu'elle n'occupe pas inutilement la mémoire ... par contre, c'est évidemment plus lent ... à savoir que mettre la lecture dans un thread et la comparaison dans un autre, avec un Double Buffer aurait un effet énorme sur les performances ... faudrait que je m'amuse un jour à finir cette variante ...

    Sinon, je vois quelques erreurs sur TMemorySearchTxt il manque le override sur le Destroy, c'est juste une très grave erreur ! MyStream n'est donc jamais libéré !

    L'utilisation d'un TMemoryStream qui charge le fichier et ensuite encore un string, donc pour un fichier de 30Mo , cela prend 30Mo pour le TMemoryStream et 30Mo pour la string, tu aurais du utiliser un TFileStream et un TStringStream ... on pourrait gagner en performance (aussi bien mémoire que temps processeur)

    Cela peut donner simplement


    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
    type
      TOwnEventFound = Procedure(FileName: String) of Object;
     
      TMemorySearchTxt = Class
        FoundEvent : TOwnEventFound;
        function PosString(const S, motif : string) : integer;
        Procedure Execute(FileName: String;String2Find: String);
      end;
     
    function TMemorySearchTxt.PosString(const S, motif : string) : integer;
    begin
      Result := Pos(motif, S);
    end;
     
    Procedure TMemorySearchTxt.Execute(FileName: String; String2Find: String);
    var
      MyString : String;
      A        : Integer;
    begin
      with TFileStream.Create(FileName, fmOpenRead	) do
      try
        SetLength(MyString, Size);
        ReadBuffer(Pointer(MyString)^, Size);
        A := PosString(MyString, String2Find);
        If A <> 0 then
          if Assigned(FoundEvent) Then
            FoundEvent(FileName)
      finally
        Free();
      end;
    end;
    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

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    autant pour moi
    effectivement je ne l'ai pas optimisé
    c'était uniquement pour faire remarquer qu'un simple pos suffisais

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  8. #8
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Points : 88
    Points
    88
    Par défaut
    Je me suis appuyé sur les exemples que vous m'avez donné qui m'ont bien aidé à mieux comprendre et a continuer, Merci et bonne journée.

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

Discussions similaires

  1. [Batch] Recherche d'une string dans plusieurs fichiers
    Par zenzedoon dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 29/12/2012, 16h14
  2. recherche string dans fichier html en shell
    Par lacassb01 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 31/01/2008, 20h26
  3. Recherche d'un mot dans fichiers JAVA
    Par arsenik7 dans le forum Langage
    Réponses: 2
    Dernier message: 02/08/2006, 11h25
  4. Réponses: 12
    Dernier message: 27/06/2005, 19h06
  5. Recherche d'un String dans un String ?
    Par apen2k2 dans le forum Langage
    Réponses: 9
    Dernier message: 14/04/2003, 11h08

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