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 :

regex et VBS


Sujet :

VBScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Par défaut regex et VBS
    bonjour à tous,
    Je cherche à formater un fichier txt afin de le rendre facilement interprétable par Excel; En somme, je dispose d'un fichier txt (issu d'une extraction d'une application) et les données sont séparées par un nombre variable d'espace.
    Je cherche donc à remplacer ce nombre variable (de 4 à 18) d'espace par un seul code caractère (";/"). De cette manière Excel pour comprendre le fichier txt en séparer les colones grace au caractère ";/".

    J'ai déjà rédigé un script avec l'aide de pusieurs messages du forum, le voici
    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
    const ForAppending = 8, ForWriting = 2, forReading= 1
     
    Set fsoFichierSource=CreateObject("Scripting.FileSystemObject")
    Set txt_source=fsoFichierSource.OpenTextFile("fichier-ref.txt", forReading)
    Set txt_dest=fsoFichierSource.CreateTextFile("fichier-res.txt", ForWtriting)
     
    set regex = new regExp
    regex.pattern="( ){2,}" 'car il y a des noms et prénoms de personnes qui sont séparés par un seul espace
    regex.global = true
     
    do while not txt_source.AtEndOfStream
     
    strLigne=txt_source.ReadLine
     
    set Matches = regex.Execute(strligne)
    For Each Match in Matches
          RetStr = Match.Value
    Next
    strligne= Replace(strligne, RetStr ,";/")
     
    txt_dest.writeline strligne
     
    loop
    'fin de la boucle
    txt_dest.close
    txt_source.Close
    msgbox("fin")
    Le problème est le suivant :
    le script ne remplace pas toutes les occurences de plus de 2 espaces dans le fichier; mais en plus lorsqu'il supprime des occurences d'espaces, il lui arrive de ne pas tout prendre :
    Par exemple, la chaine de caractère suivante :
    "Emet Gest" (il y a 23 espaces entre "Emet" et "Gest") devient "Emet;/ Gest" (il reste encore 7 espaces qui doivent être supprimés entre les deux mots)

    quelqu'un pourrait'il m'expliquer la raison de ce résultat? Il y a-t-il un nombre maximum de caractère qui peuvent être détécté par RegEx??

    merci d'avance

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    J'apprécie tes éfforts pour entourer ton code de balise, mais tu as utilisé celle pour les citations. Pour le code, il y a d'autre balises (appuie sur # pour les utiliser). Ce sera pour la prochaine fois .
    En ce qui concerne ton problème, je pensais à une chose, est ce que tes espaces sont forcément que des espaces, où est ce qu'il peut y avoir des tabulations ou des retours chariots ?
    Parce que si oui le problème peut venir de là, et il faudra en tenir compte dans ton expression régulière.

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Par défaut
    Ok, j'essairai me m'en souvenir
    Pour ce qui de ta question, il s'agit uniquement d'espaces, et j'ai beau retourner le code dans tous les sens j'obtiens toujours le même résultat!!

    RQ :
    Après étude, mon match prend bien toutes les occurences d'espace avec leur bonnes longueur, aussi j'ai l'impression que l'affectation de tous les matchs à RetStr pédale un peu dans la choucroute!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    set Matches = regex.Execute(strligne)
    For Each Match in Matches
          RetStr = Match.Value
    Next
    mais je n'arrive pas à vérifier cette impression

  4. #4
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Par défaut
    A y est!!
    J'ai un peu plus compris et ai modifié mon de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    set Matches = regex.Execute(strligne)
    For Each Match in Matches
          	'RetStr = Match.Value
    	msgbox Match.Value
    	strligne= Replace(strligne, Match.Value,";/")
    Next
     
    txt.writeline strligne
    Ainsi la ligne est modifié pour chaque valeur du match et non uniquement pour sa dernière (RetStr ne possédait que la dernière valeur du match)!

    voici un exemple de ligne que je veux tranformer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    N° DONNEE Emet                       Gest          Création          Clôture               Dest. Act.
    mais après transformation, j'obtiens cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    N° DONNEE Emet;/ Gest;/Création;/Clôture;/     Dest. Act.;/
    Et je n'arrive pas à faire disparraitre les espaces récalsitrants. Existe il un moyen de trier par ordre croissant (ou décroissant) les différentes valeur du Match?

  5. #5
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Je pense avoir trouvé ton erreur. C'est à cause du replace.
    Ton Matches est une sorte de tableau. Dans ton cas il contient pour chaque case des string consituté d'un ensemble d'espace plus ou moins grand.
    Quand tu utilises replace sur ta ligne, imaginons pour une valeur de match qui est égale à 2 espaces, tu remplaces ces 2 espaces par ";\" pour toutes les zones >= à 2 espaces. Donc par exemple aussi pour un esapcement de 8 espaces, qui devient un espacement de 6 espaces.
    Du coup lorsque tu recherches une zone de 8 espaces puisque une valeur de match la contient, replace ne remplace rien puisque 6 < 8. Et si par malheur tu n'avais pas à l'origine une zone de 6 espaces, ton fichier modifier contient toujours une zone avec 6 espaces.

    Moi j'aurais procédé autrement. Une fois ma ligne récupéré, je l'aurais splitter à l'aide de la fonction VB split (voir faq) et j'aurais récupérer tous les éléments de résultats de split qui contiennent des caractère et non juste des espaces. J'aurais ainsi concaténé ces éléments ensemble en y insérant ";/", me donnant ainsi ma ligne désiré. Puis j'aurais alors remplacé l'ancienne ligne par la nouvelle (ou créé un nouveau fichier qui contiendrais les nouvelles lignes).

    Je ne sais pas si j'ai été assez clair ?

  6. #6
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Par défaut
    Merci beaucoup
    je me suis tourné vers ta méthode, qui marche bien mieux!!
    Pour info voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    do while not txt_source.AtEndOfStream
     
    strLigne=txt_source.ReadLine 
     
    StrTableau=Split(strLigne , "  ")
    txt_dest.writeline ("	"& tab_fin(0) &"	"& tab_fin(1) &"	"& tab_fin(2) &"	"& tab_fin(3) &"	"& tab_fin(4)&"	"& tab_fin(5))
    loop
    J'ai remplacé mes "/" par des tabulations, plus pratique pour la lecture dans excel!!

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

Discussions similaires

  1. [VBS] décodage base 64
    Par windob dans le forum VBScript
    Réponses: 2
    Dernier message: 12/04/2004, 00h53
  2. [VBS] Erreur sur "AddWindowsPrinterConnection"
    Par Admin dans le forum VBScript
    Réponses: 5
    Dernier message: 27/03/2004, 16h15
  3. Création d'un vbs qui permettrait d'arreter l'agent sql
    Par cracosore dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 03/02/2004, 10h22
  4. [regex][string] replaceAll bogué ?
    Par 7eme dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 13/11/2003, 16h36
  5. Cherche regex...
    Par laurent_h dans le forum C
    Réponses: 4
    Dernier message: 31/03/2003, 11h24

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