Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

vérifier si mot existe ds fichier txt

7 réponses
Avatar
Yvan
Bonjour tout le monde !

Je réalise une macro sous Word 2000, macro qui doit vérifier si le mot
sélectionné (Mot = Selection.Text) fait partie ou non d'une liste de mots qui
sont stockés dans un fichier txt, séparés par des marques de paragraphe.

Connaissez-vous la procédure pour accéder à ce fichier txt et parcourir son
contenu et renvoyer une valeur (exemple True) si il y a une correspondance,
et une autre valeur (False par exemple) si il n'y a pas de correspondance ??

Merci d'avance pour votre aide,

Yvan

7 réponses

Avatar
Yvan
Ah, j'ai oublié de préciser que cette vérif risque de se faire à plusieurs
reprises durant l'exécution de la macro (il y a un while...wend), si ça peut
avoir une incidence sur l'ouverture/la fermeture du fichier txt...


Bonjour tout le monde !

Je réalise une macro sous Word 2000, macro qui doit vérifier si le mot
sélectionné (Mot = Selection.Text) fait partie ou non d'une liste de mots qui
sont stockés dans un fichier txt, séparés par des marques de paragraphe.

Connaissez-vous la procédure pour accéder à ce fichier txt et parcourir son
contenu et renvoyer une valeur (exemple True) si il y a une correspondance,
et une autre valeur (False par exemple) si il n'y a pas de correspondance ??

Merci d'avance pour votre aide,

Yvan


Avatar
Anacoluthe
Bonjour !

'Yvan' nous a écrit ...
Je réalise une macro sous Word 2000, macro qui doit vérifier si le mot
sélectionné (Mot = Selection.Text) fait partie ou non d'une liste de mots qui
sont stockés dans un fichier txt, séparés par des marques de paragraphe.
Connaissez-vous la procédure pour accéder à ce fichier txt et parcourir son
contenu et renvoyer une valeur (exemple True) si il y a une correspondance,
et une autre valeur (False par exemple) si il n'y a pas de correspondance ??


Le plus basiquement wordien est d'ouvrir le fichier txt
en arrière-plan et de faire un bête Rechercher. C'est simple et
rapide. On peut aussi une fois pour toute lire le fichier ligne
par ligne dans une variable ou un objet Dictionary.

Anacoluthe
« Je crois qu'il faudra tout mettre en dictionnaire. »
- VOLTAIRE

Avatar
Geo
Bonjour Yvan


Bonjour tout le monde !

Je réalise une macro sous Word 2000, macro qui doit vérifier si le mot
sélectionné (Mot = Selection.Text) fait partie ou non d'une liste de
mots qui sont stockés dans un fichier txt, séparés par des marques de
paragraphe.

Connaissez-vous la procédure pour accéder à ce fichier txt et
parcourir son contenu et renvoyer une valeur (exemple True) si il y a
une correspondance, et une autre valeur (False par exemple) si il n'y
a pas de correspondance ??


Alternative à la solution d'Anacoluthe :

Une macro pour l'ouvir et le lire
Dim Montexte As String

Sub Lecture()
Dim Ligne As String
Montexte = ""
Open "c:TempReferences.txt" For Input As #1 ' Ouvre le fichier en
lecture.
Do While Not EOF(1) ' Effectue la boucle jusqu'à la fin du fichier.
Line Input #1, Ligne ' Lit la ligne dans la variable.
Montexte = Montexte & Ligne & vbCrLf
Loop
Close #1 ' Ferme le fichier.
End Sub

et une pour rechercher

Function YEstIl(T As String) As Boolean

If InStr(T & vbCrLf, Montexte) > 0 Then
YEstIl = True
Else
YEstIl = False
End If
End Function

Pas testé

Avatar
JièL Goubert
Bonjoir(c) Geo

cette macro (que je ne trouve pas superfétatoire ;-p) me fait me poser une
question : quelle est la taille limite d'une chaine en VBA ?
Comme tu lis tout le fichier que tu met dans une seule variable, je me
demande s'il ne va pas y avoir explosion de celle ci...

--
JièL / Jean-Louis GOUBERT
La FAQ Outlook est la : http://faq.outlook.free.fr/

Le 09/05/2005 20:14 vous avez écrit ceci :
Bonjour Yvan



Bonjour tout le monde !

Je réalise une macro sous Word 2000, macro qui doit vérifier si le mot
sélectionné (Mot = Selection.Text) fait partie ou non d'une liste de
mots qui sont stockés dans un fichier txt, séparés par des marques de
paragraphe.

Connaissez-vous la procédure pour accéder à ce fichier txt et
parcourir son contenu et renvoyer une valeur (exemple True) si il y a
une correspondance, et une autre valeur (False par exemple) si il n'y
a pas de correspondance ??



Alternative à la solution d'Anacoluthe :

Une macro pour l'ouvir et le lire
Dim Montexte As String

Sub Lecture()
Dim Ligne As String
Montexte = ""
Open "c:TempReferences.txt" For Input As #1 ' Ouvre le fichier en
lecture.
Do While Not EOF(1) ' Effectue la boucle jusqu'à la fin du fichier.
Line Input #1, Ligne ' Lit la ligne dans la variable.
Montexte = Montexte & Ligne & vbCrLf
Loop
Close #1 ' Ferme le fichier.
End Sub

et une pour rechercher

Function YEstIl(T As String) As Boolean

If InStr(T & vbCrLf, Montexte) > 0 Then
YEstIl = True
Else
YEstIl = False
End If
End Function

Pas testé



Avatar
Anacoluthe
Bonjour !

'JièL Goubert' nous a écrit ...
cette macro (que je ne trouve pas superfétatoire ;-p) me fait me poser
une question : quelle est la taille limite d'une chaine en VBA ?
Comme tu lis tout le fichier que tu met dans une seule variable, je me
demande s'il ne va pas y avoir explosion de celle ci...


Geo a de la réserve !!! Dans sa variable chaîne il peut mettre
2 147 483 648 caractères ( 2 GIGAS octets !) (2 puissance 31)

Comme Geo place tout son fichier texte dans une variable
(j'aurais préféré un tableau ou un objet Dictionary mais bon)
il peut s'amuser à le charger d'un coup d'un seul ce qui
modifierait sa macro ainsi :

Public Sub Lecture()
Dim MonTexte As String
Open "c:TempReferences.txt" For Binary As #1
MonTexte = Space(LOF(1))
Get #1, , MonTexte
Close #1
End Sub

Mais dans ce cas la chaîne est de longueur fixe et limitée
à 64K ce qui est souvent suffisant pour un fichier texte.

Je continue à préférer l'ouverture wordienne du fichier texte
et l'utilisation du Rechercher, c'est plus simple question
casse. Il faudrait faire des tests comparatifs de rapidité.

Anacoluthe
« Je crois qu'il faudra tout mettre en dictionnaire. »
- VOLTAIRE

Avatar
Geo
Bonjour Anacoluthe


Dans sa variable chaîne il peut mettre
2 147 483 648 caractères ( 2 GIGAS octets !) (2 puissance 31)


Il me semblait que c'était limité par la taille mémoire, mais je dis ça de
mémoire et la mienne est nettement plus limitée.
D'après ce qu'à dit Yvan ce serait une liste de mots, ce ne serait donc pas
monumental.

Comme Geo place tout son fichier texte dans une variable
(j'aurais préféré un tableau


Ouaip mais la recherche dans un tableau c'est nettement plus compliqué que
le instr, sauf si on peut faire une recherche globalement dans un tableau,
ce que je ne sais pas.
Par contre cela permettrait de repérer le numéro du mot et donc faire des
stats sur la recherche.

ou un objet Dictionary


Allons bon, il va falloir que j'apprenne ce que c'est ce truc.

[...]

Je continue à préférer l'ouverture wordienne du fichier texte
et l'utilisation du Rechercher, c'est plus simple question
casse.


Je n'ai rien contre cette solution qui a l'avantage d'être très simple.
Pour la casse il faudrait convertir le texte en majuscules à la lecture et
faire la recherche en majuscules aussi.
par exemple If InStr(Ucase(T) & vbCrLf, Montexte) > 0 Then

Il faudrait faire des tests comparatifs de rapidité.


Encore faut-il que ce soit un souci.

--

A+

Avatar
Clément Marcotte
Bonjour,

Deux autres méthodes:

Avec les expressions régulières

Sub ChercherDansUnFichierTexte1()
Const ForReading = 1
Dim re As Object, FSO As Object
Dim fichierliste As Object, laliste As Object
Dim texteachercher As String
Dim lareference As String
'Ouvrir le fichier texte et le
'mettre dans une variable unique.
Set FSO = CreateObject("scripting.filesystemobject")
Set fichierliste = FSO.GetFile("c:mes documentsliste.txt")
Set laliste = fichierliste.OpenAsTextStream(ForReading, 0)
lareference = laliste.ReadAll
'Utiliser l'objet RE pour
'rechercher la correspondance
Set re = CreateObject("vbscript.regexp")
'Différiencer la casse
re.ignorecase = False
'Ne rechercher qu'une seule correspondance
re.Pattern = Selection
If re.test(lareference) Then
MsgBox "Le mot se retrouve dans la liste"
Else
MsgBox "Le mot n'est pas dans la liste"
End If
Set re = Nothing
Set laliste = Nothing
Set fichierliste = Nothing
End Sub


Avec un objet Dictionary

Sub ChercherDansUnFichierTexte2()
Const ForReading = 1, ForAppending = 8
Dim re As Object, FSO As Object, tableau As Variant
Dim fichierliste As Object, laliste As Object
Dim lareference As Object, i As Integer
Dim nombrelignes As Integer, laligne As String
Dim letexte As String, ilestla As Boolean
ilestla = False
Set FSO = CreateObject("scripting.filesystemobject")
Set fichierliste = FSO.GetFile("c:mes documentsliste.txt")
'trouver le nombre de lignes
'dans le fichier texte
Set laliste = fichierliste.OpenAsTextStream(ForAppending, 0)
nombrelignes = laliste.Line - 1
Set laliste = Nothing
'Ouvrir le fichier texte et le
'mettre dans un objet dictionnary.
Set laliste = fichierliste.OpenAsTextStream(ForReading, 0)
Set lareference = CreateObject("scripting.dictionary")
For i = 1 To nombrelignes
laligne = laliste.ReadLine
lareference.Add laligne, i
Next
letexte = Selection
'Récupérer la liste des mots à vérifier
'et comparer avec la sélection
tableau = lareference.Keys
For i = 0 To lareference.Count - 1
If letexte = tableau(i) Then
ilestla = True
Exit For
Else
End If
Next
'Afficher le résultat
Select Case ilestla
Case True
MsgBox "Le mot se retrouve dans la liste"
Case False
MsgBox "Le mot n'est pas dans la liste"
End Select
Set re = Nothing
Set laliste = Nothing
Set fichierliste = Nothing
End Sub


--
On apprend pas à un vieux singe à faire des grimaces
"Yvan" a écrit dans le message de
news:
Bonjour tout le monde !

Je réalise une macro sous Word 2000, macro qui doit vérifier si le
mot

sélectionné (Mot = Selection.Text) fait partie ou non d'une liste de
mots qui

sont stockés dans un fichier txt, séparés par des marques de
paragraphe.


Connaissez-vous la procédure pour accéder à ce fichier txt et
parcourir son

contenu et renvoyer une valeur (exemple True) si il y a une
correspondance,

et une autre valeur (False par exemple) si il n'y a pas de
correspondance ??


Merci d'avance pour votre aide,

Yvan