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 :

[VBS] Traitement de chaine de caractères


Sujet :

VBScript

  1. #1
    Invité
    Invité(e)
    Par défaut [VBS] Traitement de chaine de caractères
    Bonjour,

    Le code suivant permet de supprimer les caractères consécutifs identique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function DeleteConsecutiveChars (MyTxt)
        Dim I
        Dim StrOutput
        StrOutput = Mid(MyTxt, 1, 1)
        MsgBox StrOutput
        For I = 1 To Len(MyTxt) -1
            If Mid(MyTxt, I, 1)<> Mid(MyTxt, I + 1, 1) Then StrOutput = StrOutput & Mid(MyTxt, I + 1, 1)
        Next 
        DeleteConsecutiveChars = StrOutput
    End Function
     
    strSource = "AAAeeelmA12fggg35526666m"
     
    msgbox DeleteConsecutiveChars (strSource)
    J'essaie de le modifier pour permettre la suppression de groupes de caractères identiques.
    La chaine est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "[a-z]+[a-z]+[a-z]+( )[A-Z]+( )[0-9]+(.)[a-z]+[a-z]+[a-z]+( )[0-9]+"
    J'essaie d'obtenir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "[a-z]+( )[A-Z]+( )[0-9]+(.)[a-z]+( )[0-9]+"
    Je définis la longueur et la position:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    StrOutput = Mid(MyTxt, 1, 6)
    MsgBox StrOutput
    Mon MsgBox me retourne bien Je ne parviens pas définir les bonnes valeurs des fonctions de traitement de chaine.

    Un peu d'aide SVP?

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    En reprenant ton exemple AAAeeelmA12fggg35526666m.
    Quels sont les blocs de caractères identiques et a quoi doit correspondre la sortie ?

    Je dirais bien qu'un bloc est au minimum composé de deux caractères.
    Le seul que je vois est dans la chaine 6666 qui a deux blocs 66
    Le résultat sera donc AAAeeelmA12fggg3552m avec inclusion ou sans AAAeeelmA12fggg355266m

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

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 175
    Points
    17 175
    Par défaut
    Salut

    Ce que j'ai compris,
    si strSource = [a-z]+[a-z]+[a-z]+( )[A-Z]+( )[0-9]+(.)[a-z]+[a-z]+[a-z]+( )[0-9]+
    récupération = [a-z]+( )[A-Z]+( )[0-9]+(.)[a-z]+( )[0-9]+
    Car il y a répétition du groupe de caractères consécutifs identique [a-z]+
    Par contre la formule ....
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

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

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 175
    Points
    17 175
    Par défaut
    Par contre la formule ....
    A essayer avec différents strSource
    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
    Function DelGroupChars(MyTxt)
        Dim T, U, V, Deb2
        Dim StrOutput, GrpChar
    'strSource = "[a-z]+[a-z]+[a-z]+( )[A-Z]+( )[0-9]+(.)[a-z]+[a-z]+[a-z]+( )[0-9]+"
    '                         [a-z]+( )[A-Z]+( )[0-9]+(.)[a-z]+            ( )[0-9]+
        V = CInt(Len(MyTxt) / 2)
        StrOutput = MyTxt
        For T = 1 To Len(StrOutput) - 1
            V = CInt(Len(StrOutput) / 2)
            For U = 2 To V
                GrpChar = Mid(StrOutput, T, U)
                Deb2 = InStr(T + U - 1, StrOutput, GrpChar, vbBinaryCompare)
                If Deb2 = U + T Then
                    If T = 1 Then
                        StrOutput = Replace(StrOutput, GrpChar, "", Deb2, 1, vbBinaryCompare): T = T - 1
                        Else
                        StrOutput = Left(StrOutput, Deb2 - 1) & Replace(StrOutput, GrpChar, "", Deb2, 1, vbBinaryCompare): T = T - 1
                    End If
                    Exit For
                End If
            Next
        Next
        DelGroupChars = StrOutput
    End Function
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  5. #5
    Invité
    Invité(e)
    Par défaut
    OUHaHOU là ca envois du lourd !!!
    Petite question, la déclaration de la chaine strSource doit elle rester dans la Function ?
    Habituellement je sors tout ce qui est appels ou déclarations.

    Pour en revenir au code là j’ai besoin d’explication et pas des moindres !

    A la 1er lecture je n’ai pas déchiffré la moitié du code.
    En tout cas belle prouesse !
    Je viens de faire quelques tests pour le moment RAS le code traite et ne fléchit pas

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

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 175
    Points
    17 175
    Par défaut
    En fait les lignes 4 et 5 sont en commentaire, elles m'ont servies le temps du debug, j'ai oublié de les supprimer.
    Je triche, j'utilise VB6 et antérieur pour debuguer, run pas à pas, variables espions .......
    Citation Envoyé par NeriXs
    Je viens de faire quelques tests pour le moment RAS le code traite et ne fléchit pas
    J'attendais cette information, c'est pourquoi je n'ai pas commenté le code, promis, demain tu auras plus d’explications.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  7. #7
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Pour ma part je ne comprend pas les résultat obtenus

    Code vbs : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ' DelGroupChars("abab") ' Résultat : 
    ' DelGroupChars("#abab") ' Résultat : #ab
    ' DelGroupChars("ababab") ' Résultat : ab
    ' DelGroupChars("ababcdabcdcd") ' Résultat : cdabcd
    ' DelGroupChars("#ababcababc") ' Résultat : #abcabc
    ' DelGroupChars("[a-zP]+[a-zP]+[a-z]+( )[A-Z]+( )[0-9]+(.)[a-z]+[a-z]+[a-z]+( )[0-9]+") ' Résultat : [a-z]+( )[A-Z]+( )[0-9]+(.)[a-z]+( )[0-9]+

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

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 175
    Points
    17 175
    Par défaut
    Saut à vous deux

    Une petite rectification du code grace à ericlm128 et ses exemples lignes 4 et 6
    DelGroupChars("ababcdabcdcd") ' Résultat : cdabcd ---> abcd)
    DelGroupChars("[a-zP]+[a-zP]+[a-z]+( )[A-Z]+( )[0-9]+(.)[a-z]+[a-z]+[a-z]+( )[0-9]+") ' Résultat : [a-z]+( )[A-Z]+( )[0-9]+(.)[a-z]+( )[0-9]+ ---> [a-zP]+[a-z]+( )[A-Z]+( )[0-9]+(.)[a-z]+( )[0-9]+

    le code rectifié et commenté
    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
    Function DelGroupChars(MyTxt)
        Dim T, U, V, Deb2
        Dim StrOutput, GrpChar
        StrOutput = MyTxt ' si aucun changement de MyTxt, DelGroupChars sera égal
        For T = 1 To Len(StrOutput) - 1
            V = CInt(Len(StrOutput) / 2) ' au plus, la suite de caractère ne pourra être que la moitié de la phrase
     
            For U = 2 To V ' u=2 car un groupe de caractères à un minimum de 2 caractères 
                GrpChar = Mid(StrOutput, T, U) 'on augmente le taille du groupe de caractères à rechercher, à chaque tour de boucle
                Deb2 = InStr(T + U - 1, StrOutput, GrpChar, vbBinaryCompare)
                If Deb2 = T + U Then ' si un même groupe de caractères suit immédiatement
                    If T = 1 Then ' si T est le début de la phrase
                        StrOutput = Right(StrOutput, Len(StrOutput) - U) ' supprime au début de la phrase le groupe de caractères identique
                        T = T - 1 ' pour ré-sélectionné le groupe de caractères depuis le début de la phrase
                        Else
                        ' on récupéré la partie gauche de la phrase avant la répétition du groupe de caractères trouvé
    					' auquel on ajoute la partie droite de la phrase sans la  répétition du groupe de caractères trouvé
    					' quand le 3ém paramétré de la fonction Replace est <> 1, replace renvoie la partie droite
    					' de la phrase en commençant à la valeur du 3ém paramètre
    					StrOutput = Left(StrOutput, Deb2 - 1) & Replace(StrOutput, GrpChar, "", Deb2, 1, vbBinaryCompare)
                        T = T - 1
                    End If
                    Exit For
                End If
            Next
     
        Next
        DelGroupChars = StrOutput
    End Function
    le même code non commenté
    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
    Function DelGroupChars(MyTxt)
        Dim T, U, V, Deb2
        Dim StrOutput, GrpChar
        StrOutput = MyTxt
        For T = 1 To Len(StrOutput) - 1
            V = CInt(Len(StrOutput) / 2)
            For U = 2 To V 
                GrpChar = Mid(StrOutput, T, U)
                Deb2 = InStr(T + U - 1, StrOutput, GrpChar, vbBinaryCompare)
                If Deb2 = T + U Then 
                    If T = 1 Then
                        StrOutput = Right(StrOutput, Len(StrOutput) - U): T = T - 1
                        Else
                        StrOutput = Left(StrOutput, Deb2 - 1) & Replace(StrOutput, GrpChar, "", Deb2, 1, vbBinaryCompare): T = T - 1
                    End If
                    Exit For
                End If
            Next
        Next
        DelGroupChars = StrOutput
    End Function
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  9. #9
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Je ne suis pas non plus sur de comprendre ce résultat, la recherche doit être ré-effectué sur chaque résultats ?
    DelGroupChars("ababcdabcdcd") ' Résultat : cdabcd ---> abcd)
    Je m'explique, si j'effectue une recherche des groupes similaires de caractères, en parcourant de gauche à droite et en recherchant en priorité les plus grand groupe voici ce que je trouve :
    ababcdabcdcd
    Résultat : abcdabcd

    Si on rejoue la recherche sur le résultat :
    abcdabcd
    Résultat : abcd


    A noter que le sens de la recherche peux amener à des résultats différents.
    ababcbc : de gauche à droite -> abcbc
    ababcbc : de droite à gauche -> ababc

    De même que le sens de traitement de :
    - la taille de chaque groupe (chercher en premier les plus petit ou les plus grand)
    - le nombre d’occurrence de chaque groupe (trouver ceux qui ont le plus d’occurrence en premier ou l'inverse)


    Bon j'arrête de vous embêter, c'était juste quelques remarques pour avoir conscience que le résultat n'est pas une science exacte, mais dépend de la façon dont l'on traite les groupes similaires.

    Sinon bien joué ProgElecT, l'exercice n'était pas forcément simple

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

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 175
    Points
    17 175
    Par défaut
    Re

    @ericlm128, je suis d'accord avec ton analyse, d'ailleurs j'ai eu du mal à tomber sur ce que voulait NeriXs.

    En tout cas cela correspond à sa demande
    De "[a-z]+[a-z]+[a-z]+( )[A-Z]+( )[0-9]+(.)[a-z]+[a-z]+[a-z]+( )[0-9]+"
    - à "[a-z]+( )[A-Z]+( )[0-9]+(.)[a-z]+( )[0-9]+"
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je reste sur le C….
    Merci à ericlm128 pour les testes et cet échange au sommet avec ProgElecT.

    Merci ProgElecT pour la correction et les commentaires.

    Attention au caractère $ qui es venu se glisser derrière Right ligne 12.

    Encore une fois Respect.


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

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 175
    Points
    17 175
    Par défaut
    Citation Envoyé par NeriXs Voir le message
    Bonjour,
    .......
    Attention au caractère $ qui es venu se glisser derrière Right ligne 12.
    ......
    et oui, je n'ai pas refait l’essai en VBScript, Right$, en VB6 et antérieur, le $ permet d'avoir l'information des paramètres de la fonction au cours de la rédaction du code.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  13. #13
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je vais essayer de m'expliquer clairement.
    Vu que le code détecte les "doublons"
    Est-il possible dans le cas de détection de doublons d'ajouter le caractère "+" après le groupe de caractères restant?
    (Seulement s'il y avait doublons)
    Exemple:
    StrSource = [A-Z][A-Z][a-z]( )[a-z][a-z][a-z]-[A-Z]23[a-z]@[a-z][a-z]
    Récupération = [A-Z]+[a-z]( )[a-z]+-[A-Z]23[a-z]@[a-z]+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Traitement de chaine de caractère
    Par kroax dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 22/06/2007, 15h09
  2. [VBS]traitement de chaine
    Par tsotb dans le forum VBScript
    Réponses: 3
    Dernier message: 28/04/2006, 10h27
  3. [VB6]Traitement de chaine de caractère + conversion
    Par kboo dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 24/04/2006, 09h23
  4. [XSL] Optimisation d'un traitement de chaines de caractères
    Par mathieu dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 05/02/2006, 18h57
  5. Traitement de chaine de caractères
    Par lapartdombre dans le forum Langage
    Réponses: 9
    Dernier message: 03/02/2006, 09h29

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