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