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

VBScript Discussion :

recherche dans une chaine accentuée


Sujet :

VBScript

  1. #1
    Membre très actif
    Avatar de joreveur
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 293
    Par défaut recherche dans une chaine accentuée
    Bonjour,

    j'ai d'énormes fichiers textes dans lesquels je fait des recherches via InStr
    cela marche très bien.

    dans mes fichiers il y a des accents des cédilles etc. ...

    par exemple si dans une chaine il y a le mot "forêt", je voudrais en cherchant foret qu'il me trouve la phrase.

    qu'elle est la meilleure astuce ?

    actuellement je fais une variable dans laquelle je remplace les é,è,ê,ë etc. par des e via des boucles... et je cherche dans cette variable, mais cela est peu performant voire pas du tout..

    et comme en français il y beaucoup de lettres accentuées...

    merci de vos conseils.

  2. #2
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    salut,
    ici une piste pour éliminer tous les caractères accentués avant de faire une recherche
    c'est du javascript mais l'objet regexp existe également en vbscript (voir la doc)
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  3. #3
    Membre très actif
    Avatar de joreveur
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 293
    Par défaut
    Bonjour et merci de l'info.

    et en vbs ça se traduit comment ?

    entre temps j'avais essayé par l'instruction replace, même si c'est déjà plus performant ce pas encore ça.

  4. #4
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 420
    Par défaut
    entre temps j'avais essayer par l'instruction replace.../...
    Montre ce que tu as fait pour qu'on puisse y voir plus clair et essayer de t'aider.
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  5. #5
    Membre très actif
    Avatar de joreveur
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 293
    Par défaut
    Bonsoir,

    un bout de code adapté pour l'exemple à donner
    mais si j'ai 1.000.000 de lignes à traiter en parcourant un fichier, c'est peu rapide

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    Sub change()
     
    Str1=Replace(str1,tx, ty)
     
    Str1=Replace(str1,ucase(tx), ty)
     
    End Sub
     
     
    Sub trans(str1)
     
    ty="a"
     
    tx="à":change()
     
    tx="ä":change()
     
    tx="â":change()
     
     
     
    ty="e"
     
    tx="è":change()
     
    tx="é":change()
     
    tx="ê":change()
     
    tx="ë":change()
     
     
     
    ty="i"
     
    tx="î":change()
     
    tx="ï":change()
     
     
     
    ty="o"
     
    tx="ô":change()
     
    tx="ö":change()
     
     
     
    ty="u"
     
    tx="ù":change()
     
    tx="ü":change()
     
    tx="û":change()
     
     
     
    ty="y"
     
    tx="ÿ":change()
     
     
     
    ty="c"
     
    tx="ç":change()
     
     
     
    'ponctuation
     
    ' ty=" "
     
    ' tx=".":change()
     
    ' tx=";":change()
     
    ' tx=":":change()
     
    ' tx=",":change()
     
    ' tx="?":change()
     
    ' tx="!":change()
     
    ' tx=chr(34):change() ' guillemets
     
    ' tx=">":change()
     
    ' tx="<":change()
     
    'etc ...
     
    End Sub
     
     
     
    str1="À Paris, les français voyagent en métro. Le dimanche ils se promènent en forêt."
     
    msgbox(str1)
     
    trans(str1)
     
    msgbox(lcase(str1))
    str1 est normalement issu du fichier à lire

  6. #6
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 130
    Par défaut
    A verifier si plus rapide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim ReChercher, RemplacPar, T, str1
     
    ReChercher = Array("À", "à", "ä", "â", "ç", "è", "é", "ê", "ë", "î", "ï", "ô", "ö", "ù", "û", "ü", "ÿ")
    RemplacPar = Array("A", "a", "a", "a", "c", "e", "e", "e", "e", "i", "i", "o", "o", "u", "u", "u", "y")
     
    str1 = "À Paris, les français voyagent en métro. Le dimanche ils se promènent en forêt."
     
    MsgBox (str1)
     
    For T = 0 To UBound(ReChercher)
            str1 = Replace(str1, ReChercher(T), RemplacPar(T))
    Next
    MsgBox str1
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  7. #7
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 420
    Par défaut
    Salut;

    ProgElecT, tu m'as devancé.
    En demandant le code à l'intervenant, j'ai pensé à une idée pareille à la tienne mais utilisant des constantes à la places des tableaux. Je l'expose quand même si cela peut aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Option Explicit
    Const Ch1="Âàäâéèêëùüûôö"
    Const Ch2="Aaaaeeeeuuuoo"
    Dim I,Src
    Src="Â l'école(ou collège), où on répète les mêmes idées, on n'est pas déjà sûr de l'intérêt"
    ' C'est tout simplement une phrase avec caractères accentués(ce n'est pas mon opinion)
     For I=1 to Len(Ch1)
       Src=Replace(Src,Mid(Ch1,I,1),Mid(Ch2,I,1))
     Next 
    MsgBox Src
    à moins que ce ne soit plus gourmand en mémoire.
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  8. #8
    Membre très actif
    Avatar de joreveur
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 293
    Par défaut
    Bonjour,


    merci de vos idées c'est gentil de vous intéresser à ce problème. Je vais tester quand j'aurais un peu de temps.

    la solution que j'avais retenue, en tout premier temps et que j'ai abandonné était effectivement de regarder chaque caractère d'une chaine et de les remplacer. dans cette version je faisais des "if" et je remplaçais au fur et à mesure.

    la seconde est celle que je vous ai proposée marche beaucoup mieux mais encore trop lente.

    Vos méthodes semblent beaucoup mieux car elles ne parcourent que le tableau (ou la chaine de caractères accentuées) ce qui est généralement moins long à parcourir que la chaine à analyser.

    à priori je pense que l'idée des tableaux et plus pertinente car elle utilise directement les index des tableaux sans recourir à la fonction mid qui est appelée 2 fois pour toutes les occurrences des boucles.


    mais je ferais des essais et vous ferais une petite stat .

    quand à la fonction regexp je ne vois pas trop comment elle s'utilise.

    en tous cas merci à chacun de cette contribution.

  9. #9
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    quand à la fonction regexp je ne vois pas trop comment elle s'utilise.
    dommage...
    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
    18
    19
    20
    sBuf = "À l'école (ou au collège haï), où on répète les mêmes idées, on n'est pas déjà sûr de l'intérêt d'y aller à moins d'être maso"
    Set oRegEx = New RegExp
    ' casse ignorée
    oRegEx.IgnoreCase = True
    ' remplacement sur l'ensemble de la chaine
    oRegEx.Global = True
    ' définition des patterns
    oRegEx.Pattern = "[àâ]"
    sBuf1 = oRegEx.Replace(sBuf,"a")
    oRegEx.Pattern = "[éèêë]"
    sBuf2 = oRegEx.Replace(sBuf1,"e")
    oRegEx.Pattern = "[îï]"
    sBuf3 = oRegEx.Replace(sBuf2,"i")
    oRegEx.Pattern = "[öô]"
    sBuf4 = oRegEx.Replace(sBuf3,"o")
    oRegEx.Pattern = "[ùüû]"
    sBuf5 = oRegEx.Replace(sBuf4,"u")
    oRegEx.Pattern = "[ç]"
    sBuf6 = oRegEx.Replace(sBuf5,"c")
    MsgBox sBuf6
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  10. #10
    Membre très actif
    Avatar de joreveur
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 293
    Par défaut
    Bonjour et merci pour le code.

    Je vais regarder cela de plus près.

    Je ferais à l'occasion une synthèse en terme de performances.

    PS. J'essaierai aussi avec mon langage préféré FreePascal

Discussions similaires

  1. [Sql Server] Fonction de recherche dans une chaine
    Par pierre031183 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/01/2011, 16h16
  2. Recherche dans une chaine de caractères
    Par stepd dans le forum C
    Réponses: 4
    Dernier message: 19/07/2006, 18h55
  3. Recherche dans une chaine de caractere
    Par sam.fet dans le forum Linux
    Réponses: 5
    Dernier message: 15/05/2006, 18h08
  4. Client POP3 en C - Recherche dans une chaine
    Par titelily dans le forum C
    Réponses: 12
    Dernier message: 13/06/2005, 02h13
  5. [VB.NET] Recherche dans une chaine de caractères
    Par Pleymo dans le forum Windows Forms
    Réponses: 12
    Dernier message: 09/04/2005, 10h25

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