salut Yannick,

mais apparemment ton script n'a pas pu trouver mon numéro du téléphone !
mdr


De : Yannick Youalé 
Date : mercredi 3 juin 2015 14:18
À : progliste@ml.free.fr 
Objet : [progliste] Script de recherche de proximité


Salut à tous !

Je suis là ce midi pour vous mettre le cerveau en ébulition.

Lorsqu'on veut faire de la recherche de texte dans un document, j'ai identifié 
un type de recherche auquel nous avons tous pensé, mais que nous n'avons jamais 
(je pense) eu le courage de réaliser.

C'est ce que j'ai appelé la recherche de proximité.

Prenons un cas de figure.

Nous avons un document dans lequel nous avons de nombreuses fois écrit le nom 
de Maan Aloun. Disons une cinquantaine de fois.

Mais à l'intérieur de ce document, à un seul endroit il y a son nom suivi de 
son numéro de téléphone. Seulement, vous ne vous rappellez pas exactement 
comment ça a été écrit à cet endroit-là.

On peut biensûr faire un Ctrl+F, et ensuite faire suivant, suivant, suivant, 
jusqu'à ce qu'on tombe sur la bonne occurence du nom de Maan, celui qui est à 
côté du numéro de téléphone.

Quoi que reconnaissez que ça peut être vraiment chiant de le faire 35 fois 
avant de tomber sur la bonne occurence.

C'est pourquoi j'ai conceptualisé la recherche de proximité, pour pouvoir faire 
aisément de la recherche dans les fichiers fourre-tout.

En gros il s'agit d'un script, dont l'exécution affiche :

* une première inputbox qui vous demande la première expression à rechercher;

* ensuite une seconde inputbox qui vous demande la seconde expression à 
rechercher

* et puis une troisième inputbox qui vous demande la distance maximale de 
nombre de caractères autorisée entre ces deux expressions.

Lorsqu'on lancera la recherche par exemple pour trouver le numéro de téléphone 
de Maan dans notre fichier, comme première expression on taperais "Maan", et 
comme deuxième expression on taperait "tél|tel", et enfin comme nombre de 
caractère maximal de distance on mettrait 50.

Ce qui fera que le script ne s'arrêtera que à l'endroit où le mot "Maan" sera 
suffisamment proche de l'expression "tél" ou "tel".

Génial n'est-ce pas ?

Je sais, je sais !

Maintenant que j'ai inoculé cette idée dans vos têtes, je ne vous donnerais 
biensûr pas le script pour tous vos éditeurs de texte, mais j'aimerais quand 
même vous inspirer en vous collant à la suite ce que j'ai fais en VBScript pour 
mon éditeur à moi, le XPC.

Début du code VBScript

' script de recherche de proximité entre plusieurs mots
' dans le document courant ou dans un fichier distant indiqué.

function RechercheProximite ()
' fonction de recherche de proximité de mot dans le texte courant
' ou dans un texte distant.

' déclaration des variables
dim s
dim s1
dim s2
dim sPath
dim sResult
dim i
dim iGap
dim iRangeBefore
dim iRangeAfter
dim pt
dim lPosStart
dim lPosEnd
dim reg
dim ColMatch
dim mat

' demande du fichier dans lequel faire la recherche
' et recueillement du contenu de ce fichier.
sPath = "D:\liste des choses à faire.txt" ' fichier par défaut
sPath = Inputbox("Tapez le chemin du fichier dans lequel faire la recherche." & 
vbcrlf & _
"S'il s'agit du fichier courant, ne mettez rien dans ce champ.", "Fichier à 
traiter", sPath)
if FileExist(sPath) = true then
s = ReadFile(sPath)
else
s = ActiveDocument.Text
end if
s = " " & s & " "
' demande de la première expression
s1 = trim(inputbox("Tapez la première expression à rechercher"))
if s1 = "" then
exit function
end if

' demande de la seconde expression
s2 = trim(inputbox("Tapez la seconde expression à rechercher"))
if s2 = "" then
exit function
end if

' le nombre maximum de caractère de distance entre ces expressions
iGap = CLng(inputbox("Tapez le nombre maximum de caractère de séparation entre 
ces deux expressions"))
if iGap <= 0 then
' beep
SayString "Annulation de la recherche", 0
exit function
end if

' demande du nombre de caractères avant et après à recueillir
iRangeBefore = CLng(Inputbox("Tapez le nombre de caractères à recueillir avant 
les expressions trouvées."))
iRangeAfter = CLng(Inputbox("Tapez le nombre de caractères à recueillir après 
les expressions trouvées."))
' création du pattern qui sera utilisé en expression régulière
pt = "((" & s1 & ")[\w\W]{0," & iGap & "}(" & s2 & "))"
pt = pt & "|((" & s2 & ")[\w\W]{0," & iGap & "}(" & s1 & "))"

' création et exécution de la regexp
set reg = CreateObjectRegexp
set ColMatch = CreateObjectMatchCollection
set mat = CreateObjectMatch

reg.Global = true
reg.IgnoreCase = true
reg.Multiline = false
reg.Pattern = pt

' message d'attente et exécution
SayString "Veuillez patienter pendant le traitement du document", 0
set ColMatch = reg.Execute (s)
' s'il n'y a rien de trouvé
if ColMatch.Count = 0 then
msgbox "Aucune occurence d'une proximité à moins de " & iGap & " caractère n'a 
été trouvée entre les deux expressions dans le document", vbOKOnly + 
vbExclammation, "Aucune occurence trouvée"
exit function
end if

sResult = ""
i = 0
for each mat in ColMatch
i = i+1 ' incrémentation du compteur
lPosStart = mat.FirstIndex
lPosEnd = lPosStart + len(mat.Value)
' prise en compte des caractères supplémentaires à ajouter au début
if lPosStart - iRangeBefore < 1 then ' débordement au début
lPosStart = 1
else
lPosStart = lPosStart - iRangeBefore
end if
' prise en compte des caractères supplémentaires à ajouter à la fin
if lPosEnd + iRangeAfter > len(s) then ' débordement à la fin
lPosEnd = len(s)
else
lPosEnd = lPosEnd + iRangeAfter
end if
' identification de la partie
s1 = mid(s, lPosStart, lPosEnd-lPosStart+1)
' on en retire les retours à la ligne
s1 = replace(s1, chr(10), " ")
s1 = replace(s1, chr(13), " ")
'  ajout de la partie identifiée au résultat global
sResult = sResult & i & "..." & s1 & "..." & vbcrlf & vbcrlf
next

' envoi du résultat dans le presse-papier
ClipboardSetText sResult
SayString "Envoi du résultat dans le presse-papier", 0

end function

' exécution de la fonction
RechercheProximite

Fin de code VBScript

En espérant que cela inspirera réellement quelqu'un...

Yannick Daniel Youalé
La programmation est une religion. Aimez-la, ou quittez-la.
Mon site: www.visuweb.net











Répondre à