Recherche de plusieurs mots dans un texte [Résolu]

Sebcode 11 Messages postés vendredi 15 juillet 2011Date d'inscription 17 juillet 2014 Dernière intervention - 16 févr. 2012 à 21:51 - Dernière réponse : Sebcode 11 Messages postés vendredi 15 juillet 2011Date d'inscription 17 juillet 2014 Dernière intervention
- 28 févr. 2012 à 21:17
Bonjour,

J'ai écrit un bout de code me permettant de rechercher un mot ou une phrase dans un fichier texte. Si ce mot est présent dans le fichier je lance une routine, sinon je refais une lecture du fichier 15 minutes plus tard. Avec le temps, le nombre de mots à rechercher a augmenté. Jusqu'à présent, je faisais ma recherche avec une condition du type:
If mot1 or mot2 or mot3 est dans texte alors ...

Mais j'aimerai pouvoir ajouter des mots (ou phrases) sans "réécrire le code" à chaque fois.
J'ai pensé utiliser un fichier (txt), contenant les mots ou phrases à rechercher et à le comparer à mon fichier texte. Si l'un des mots contenu dans le fichier txt apparait dans le fichier texte, alors je lance ma routine sinon j’attends le prochain tour.

Le probleme, c'est que je n'ai aucune idée de comment faire. J'ai bien fais une recherche sur le site (une page existe mais elle est inaccessible) ou par google (mais il s'agit tjrs de rechercher UN mot).

Si quelqu'un pouvait passer par là et me donner un coup de main, ça serait super sympa!
Afficher la suite 

5 réponses

Répondre au sujet
Sebcode 11 Messages postés vendredi 15 juillet 2011Date d'inscription 17 juillet 2014 Dernière intervention - 28 févr. 2012 à 21:17
+3
Utile
ça y est! J'ai mis du temps à comprendre l’utilité d'un tableau... mais maintenant je ne peut plus m'en passer!
Pour ceux que cela intéresse, voici quelques bouts de mon code:

Pour charger un fichier texte ligne par ligne dans un tableau j'utilise,
'ouverture du fichier textes et creation du tableau Tbl
Open Fichier_texte For Input As 2
Tbl = Split(Input(LOF(2), #2), vbCrLf)
Close #2


Pour comparer mon tableau a un autre fichier texte (pour trouver des correspondances)je fais,
Open autre_fichier_texte For Input As 1 
Do Until EOF(1) 'tant qu'on est pas à la fin du fichier "1":

Line Input #1, tmp 'on lis la ligne et on la stock dans la variable tmp

'Test de la présence de tous les mots du tableau pour correspondance dans la ligne tmp
For i = i To UBound(Tbl)
If ((InStr(tmp, Tbl(i))) > 0) Then 
MotPresent = True 'si on trouve un correspondance,
Exit For 'on sort de la boucle, sinon on continu jusqu'a la fin
End If
Next

If MotPresent = True Then

CALL 'Insérer ici le traitement à appliquer

i = 0 'reset du compteur 
MotPresent = False

Else 'sinon on continu la lecture 

CALL 'Insérer ici le traitement à appliquer

i = 0 'reset du compteur
MotPresent = False

End If 'End if à l'interieur de la boucle "DO LOOP"

Loop
Close #1 'fermeture du fichier temporaire "1"


Voila, ce n'est qu'un bout de code sans prétention, mais si cela peut dépanner quelqu'un...

Merci à NHenry pour m'avoir mis sur la piste, et à tous ceux qui reconnaitront leurs bouts de code.

PS: Pour donner une idée de la "vitesse d’exécution du code", je recherche 5 phrases dans un fichier texte de 400 lignes en moins d'une seconde. Je ne sais pas ce que cela vaut, mais pour mon utilisation , c'est suffisamment rapide.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Sebcode
NHenry 14135 Messages postés vendredi 14 mars 2003Date d'inscription 24 avril 2018 Dernière intervention - 16 févr. 2012 à 23:11
0
Utile
Bonjour,

Comment fais-tu actuellement ?

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Commenter la réponse de NHenry
Sebcode 11 Messages postés vendredi 15 juillet 2011Date d'inscription 17 juillet 2014 Dernière intervention - 17 févr. 2012 à 07:40
0
Utile
Merci NHenry de prendre de nouveau le temps de me repondre. Voici le code que j'utilise actuellement:

Open place1 For Input As 1 'on ouvre le fichier à analyser dont le chemin est dans "place1" et on l'inscrit dans le fichier temporaire "1"
Do Until EOF(1) 'tant qu'on est pas à la fin du fichier "1":

Line Input #1, tmp 'on lis la ligne et on la stock dans la variable tmp

If ((InStr(tmp, mot1)) > 0) _
Or ((InStr(tmp, mot2)) > 0) _
Or ((InStr(tmp, mot3)) > 0) _
Or ((InStr(tmp, mot4)) > 0) _
Or ((InStr(tmp, mot5)) > 0) _
Or ((InStr(tmp, mot6)) > 0) _
Then 'on vérifie si le mot recherché est dans la ligne "tmp"

Call test_alert 'vers sub pour tester si fausse alerte

Else 'sinon on continu la lecture du fichier log et on garde en memoire la ligne en cas d'envois de mail
tmp10 = tmp9
tmp9 = tmp8
tmp8 = tmp7
tmp7 = tmp6
tmp6 = tmp5
tmp5 = tmp4
tmp4 = tmp3
tmp3 = tmp2
tmp2 = tmp1
tmp1 = tmp
End If 'End if à l'interieur de la boucle "DO LOOP"

Loop
Close #1 'fermeture du fichier temporaire "1"


Donc si je trouve un des six mots dans une ligne de #1, je vais à "test_alert" sinon, je stock les dernieres ligne "lu" pour un prochain usage.

Maintenant, j'aimerai utiliser un fichier txt pour stocker les mots plutot que d'avoir à créer une nouvelle ligne "Or ((InStr(tmp, mot4)) > 0) ".

cordialement,
Commenter la réponse de Sebcode
NHenry 14135 Messages postés vendredi 14 mars 2003Date d'inscription 24 avril 2018 Dernière intervention - 17 févr. 2012 à 23:52
0
Utile
Bonjour,

Utilises des tableaux plutôt ou des Collections.
Ensuite, tu boucles sur tous les éléments du tableau et ce sera plus simple

Dim MonTab() as String
Redim MonTab(0 To 9)
MonTab(0)="..."
...
MonTab(9)="..."

MotPresent=False
For i=0 to Ubound(MonTab)
    If Instr(tmp,MonTab(i))<>0 then 
        MotPresent=True
        Exit For
    End If
Next i

If MotPresent then
    test_alert 'Pas besoin du Call
Else
    ...
End If


Regardes l'aide du mot clé Redim et de sa variante Redim Preserve.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Commenter la réponse de NHenry
Sebcode 11 Messages postés vendredi 15 juillet 2011Date d'inscription 17 juillet 2014 Dernière intervention - 20 févr. 2012 à 08:34
0
Utile
Oui, je créé un tableau 1 dimension pour stocker les mots recherchés mais du coup, à chaque fois que je dois rajouter un mot dans la liste, il faut que je recompile le prog.

En fait, je pensai plus à utiliser un "fichier dico" au format texte contenant les mots à rechercher et le comparer au fichier log (#1)

Le pb c'est que cela m'oblige à lire autant de fois le fichier log, qu'il y a de mots à rechercher. (Je charge la premiere ligne du "dico", je recherche dans le fichier log. Je charge la 2ème ligne du dico, etc)

Si tu as une autre idée, je suis preneur.

cdlt,
Commenter la réponse de Sebcode

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.