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

Turbo Pascal Discussion :

[TP]Recherche de mots dans un Doc.


Sujet :

Turbo Pascal

  1. #1
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 843
    Points
    4 843
    Par défaut [TP]Recherche de mots dans un Doc.
    Bonjour, je voudrais rechercher, dans un document texte, une suite donnée de caractères sans que ça prenne toute la CPU du PC et sans que ça tourne pendant trois heures pour trouver le résultat.

    En fait je voudrais coder une commande similaire au "Ctrl+F" ou "F3" existant dans la plupart des logiciels tournant sous Windows.

    Pour ça j'ai pensé à faire un truc du style (ce n'est pas mon programme mais une simple ébauche) :
    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
     
    const mot = 'bla';
     
    var 
    s,t : string; F : text; i : integer; trouvé : boolean;
     
    begin
    while not EoF(F) do begin
    readln(F,s);
    i:=0;
    while not length(s) and not trouvé then
       begin
       t:=s; inc(i);
       t:=copy(S,i,3);
       if t=mot then trouvé = TRUE;
    end;
    end;
    Les seuls problèmes sont que :
    1. Ca prend un temps fou pour peu que le document soit long.
    2. Ca ne prend pas en compte tous les éléments d'une ligne si elle compte plus de 255 charactères.

    En gros, c'est inutilisable.

    Donc, si vous avez une idée de comment faire l'équivalent d'un "Ctrl+F", proposez-là s'il vous plaît !

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Je pense que le plus simple, et que tu fasses une recherche pour chaque caractère, les uns après les autres. Si on reprend ton exemple, imaginons que tu recherches le mot 'bla' dans ton fichier. Tu vas parcourir donc tout le fichier en recherchant un 'b', dès que tu en trouves un, tu vérifie si la suite des caractères du fichier est égale au reste du mot que tu cherches. Tu vérifies donc si les lettres qui suivent le 'b' de ton fichier forment une suite 'la'. Pour simplifier, ca donne un alorithme comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    tant que il existe des caractères dans le fichier
    faire
      vérifier si le caractère lu est la première lettre du mot
      si caractère lu = première lettre du mot
      alors vérifier si les caractères suivant sont égaux au reste du mot
      fin si
     fint tant que
    Voilà le squelette de l'algorithme je pense, tu peux évidemment l'améliorer lors de l'implémentation en gérant les erreurs par exemple...

    a+

  3. #3
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 968
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 968
    Points : 59 748
    Points
    59 748
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Egalement, sans changer grand chose à ta boucle de recherche, tu pourrais appliquer la fonction Pos(), qui recherche la position d'une chaîne dans une autre.

    Les performances devraient être meilleures car la fonction Pos() cache des instructions assembleur scasb ou scasw.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    const mot = 'bla'; 
     
    var 
    s : string; F : text; trouve : boolean; 
     
    begin 
     
    trouve := false;
    while not EoF(F) and not trouve do begin 
      readln(F,s); 
      trouve := (pos(mot,s) <> 0)
    end;

  4. #4
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 843
    Points
    4 843
    Par défaut
    Ok merci.

    A vrai dire, ma première idée avait été de faire ce que tu as proposé, Wormful : je regarde s'il trouve le caractère et, si c'est le cas, je vérifie si les caractères suivants correspondent.

    Seulement j'ai du mal avec la fonction read... Enfin faudra bien que je m'y fasse un jour.

    Je crois d'ailleurs que je vais appliquer cette méthode parce que mon but est de virer toutes les images d'un fichier codé en html, donc avec des lignes comportant beaucoup de caractères (plus de 255 ama), ce qui m'empêche d'utiliser la fonction readln (et la fonction pos).

  5. #5
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    La fonction read n'est pas très conseillée avec l'utilisation des fichiers Texte, car il existe un effet de bord pour les caractères de fin de lignes.
    Je te conseillerais d'utiliser un fichier typé plutôt, du style file of char. Dans ce cas ci, tu pourras lire le fichier caractère par caractère, avec read, sans te soucier des fins de ligne.

    a+

  6. #6
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Pour les lignes de plus de 255 caractères, tu peux te rabattre sur le type PChar qui gère jusqu'à 65535 caractères théoriques, 65520 en pratique. Ca permet de voir plus grand.

    Regarde alors le contenu de l'unité Strings qui propose des routine de gestion des PChar.

    Sinon, pour vraiment gagner en rapidité, rien ne vaut nu passage à l'assembleur. Avec du 32 bits, tu pourrais analyser 4 caractères quasiment en même temps.

    A+

  7. #7
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 968
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 968
    Points : 59 748
    Points
    59 748
    Billets dans le blog
    2
    Par défaut
    Pour travailler en dword, une boucle avec l'instruction SCASD peut être codée dans une directive inline, en prenant toutefois certaines précautions avec le registre ES.

  8. #8
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 843
    Points
    4 843
    Par défaut
    Merci bien, mon problème est résolu.

    Par contre je serais curieux de voir ce que je devrais programmer en assembleur pour arriver à ça ! Surtout en prennant en compte que je ne connais rien à l'assembleur et que le peu que j'en ai vu m'a parut assez obscur.

  9. #9
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 968
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 968
    Points : 59 748
    Points
    59 748
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Loceka
    Merci bien, mon problème est résolu
    Tu peux alors presser le bouton "Résolu" en bas et à gauche de la fenêtre.

    Quant-à programmer tout cela en assembleur, ce ne serait pas spécialement monstrueux : la lecture du fichier texte serait peut-être un peu délicate mais par contre la recherche de chaîne serait assez facile.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/05/2014, 00h19
  2. Rechercher un mot dans un texte
    Par BernardT dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/12/2005, 09h55
  3. [Regex]Recherche de mots dans une chaîne
    Par lionel69 dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 17/11/2005, 19h20
  4. rechercher un mot dans un titre
    Par MANU_2 dans le forum Requêtes
    Réponses: 3
    Dernier message: 09/11/2005, 13h02
  5. Recherche de mot dans un CRichEdit
    Par jawad91 dans le forum MFC
    Réponses: 1
    Dernier message: 28/04/2005, 16h36

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