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 :

Découpage de chaîne.


Sujet :

VBScript

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut Découpage de chaîne.
    Bonjour,

    J'ai une chaine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    phrase = "127.0.0.1    - 255.255.255.128- 00-86-9d-8d-48-3c   -27/10/2013 03:40:47    -D-  pc1.mon.domaine.fr"
    Je souhaiterais extraire des données de ma chaine de facon propre. je pense que le plus simple est de spliter au séparateur "-".

    Comment faire pour extraire : IP, Mask, MAC, DateTime Type Device.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    phrase = "127.0.0.1    - 255.255.255.128- 00-86-9d-8d-48-3c   -27/10/2013 03:40:47    -D-  pc1.mon.domaine.fr"
     
    wscript.echo parse(phrase)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function parse(strtoparse)
        'découpe la chaine en fonction des tirets "-"
        'le résultat de la fonction Split est stocké dans un tableau
        Tableau = Split(strtoparse, "-")
     
        'boucle sur le tableau pour visualiser le résultat
        For i = 0 To UBound(Tableau)
        	'Le résultat s'affiche dans la fenêtre d’exécution de l'éditeur de macros
            parse = parse &  Tableau(i)
        Next
    end function
    Merci d'avance pour votre aide.

  2. #2
    Expert éminent
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 839
    Points : 9 222
    Points
    9 222
    Par défaut

    Juste une question est-ce-que ceci est un LogFile qui est généré par un script automatiquement ?

  3. #3
    Expert éminent
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 839
    Points : 9 222
    Points
    9 222
    Par défaut

    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
    Function parse(strtoparse)
        'découpe la chaine en fonction des tirets "-"
        'le résultat de la fonction Split est stocké dans un tableau
        Tableau = Split(strtoparse,VbCrLF)
     
        'boucle sur le tableau pour visualiser le résultat
        For i = 0 To UBound(Tableau)
        	'Le résultat s'affiche dans la fenêtre d’exécution de l'éditeur de macros
            parse = parse &  Tableau(i) & VbCrLF
        Next
        parse = parse
    End Function
    Titre = "Découpage de Chaînes"
    phrase = " 127.0.0.1  "&vbCrLf&" 255.255.255.128  "&vbCrLf&" 00-86-9d-8d-48-3c  "&vbCrLf&" 27/10/2013 03:40:47    "&vbCrLf&" D : pc1.mon.domaine.fr"
    MsgBox parse(phrase),64,Titre

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut
    Merci pour ta réponse

    La phrase est le résultat d'une commande DOS en fait donc ça ne va pas aller

    La syntaxe de retour de la commande exacte est ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "127.0.0.1    - 255.255.255.128- 00-86-9d-8d-48-3c   -27/10/2013 03:40:47    -D-  pc1.mon.domaine.fr"
    Le séparateur le mieux adapté est donc le tiret.
    Parfois il y a un espace avant ou après le tiret, parfois non.
    A un moment l'@MAC comprend que des tirets :00-86-9d-8d-48-3c, il faut donc les garder sans les couper, etc... pas facile



    Donc le retour chariot vbCrLf que tu as ajouté, ca ne fonctionnera pas

    Merci.

  5. #5
    Expert éminent
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 839
    Points : 9 222
    Points
    9 222
    Par défaut

    Pouvez-vous poster le code du batch ?

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut
    Compliqué, c'est le résultat d'une commande DHCP.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    netsh dhcp server \\localhost scope 127.0.0.1 show clients 1
    Ce qui va donner exactement :
    127.0.0.1 - 255.255.255.192- 00-80-9f-57-4d-d3 -27/10/2013 06:12:22 -D- Monpc1.mondomaine.fr
    127.0.0.2 - 255.255.255.192- 00-80-9f-7b-3c-8c -27/10/2013 06:06:33 -D- Monpc2.mondomaine.fr
    127.0.0.3 - 255.255.255.192- 00-80-9f-7a-83-a2 -27/10/2013 06:09:40 -D- Monpc3.mondomaine.fr
    En affichant les caractères spéciaux dans notepad++, il n'y a pas de tabulation dans les lignes que des espaces et retour chariot CRLF à chaque ligne.

    Je ne sais pas si tu auras plus d’éléments de réponse

    merci bcp.

  7. #7
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut
    Salut,

    Voilà la solution à ton problème !

    C'est pas en VBS mais vu que tu est déjà en ligne de commande ça devrait pas
    te poser de problème.

    C'est mon ami Hackoo qui ma demander de regarder ton problème...

    Voilà :

    Tu remplace "toto.log" par le nom de ton log.
    le fichier de sortie sera sortie.log

    traite.bat

    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
     
    @echo off&cls & color 17
     
    :::Le Path du fichier log
     
    set $log="toto.txt"
     
    :::Le Path du fichier log de sortie
     
    set $sortie="sortie.log"
     
     
    setlocal enabledelayedexpansion
     
     
    :::ON RECUPERE LES ELEMENTS INTRESSANTS DE CHAQUE LIGNE
     
    set $c=1
    for /f "delims=" %%a in ('type %$log%') do for %%b in (%%a) do (if !$c! equ 1 set #IP=%%b
                                                                    if !$c! equ 3 set #MASK=%%b
                                                                    if !$c! equ 4 set #MAC=%%b
                                                                    if !$c! equ 5 set #DATE=%%b
                                                                    if !$c! equ 6 set #HEURE=%%b
                                                                    if !$c! equ 7 set #TYPE=%%b
                                                                    if !$c! equ 8 set #SITE=%%b
                                                                    set /a $c+=1)
     
    :::ON ENLEVE LES "-" SUPERFLUE LORSQUE C'EST NECESSAIRE
     
    set #DATE=!#DATE:-=!
    set #MASK=!#MASK:-=!
    SET #TYPE=!#TYPE:-=!
     
    :::ET ON SAUVE DANS UN NOUVEAU LOG
     
    (echo.
     echo !#site!
     echo !#DATE! !#HEURE!
     echo !#IP!
     echo !#MASK!
     echo !#MAC!
     echo !#TYPE!
     echo.
     echo -----------) >>%$sortie%
     
     
    set #
     
    echo Termin‚
    A+
    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

  8. #8
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut
    merci pour ton aide sacah mais il me faut du vbs pas du batch

    Je doit intégrer ca dans un seul script HTA.

    Je vais spliter à chaque "-" pour le moment, ca va le faire mais c'est moche

    Merci à toi.

  9. #9
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut
    Je doit intégrer ca dans un seul script HTA.
    Tu peux très bien l'intègrer de manière transparente, en génerant le code batch avec ton VBS et en l'executant en mode "Hide" et en le détruisant. Je vois pas le problème.

    Ou sinon recrée ce code en VBS.

    Je ne suis pas un spécialiste du VBS, mais en bouclant avec un "ReadFile" sur ton fichier log et en utilisant la fonction "Split" pour découper ta ligne et attribuer une variable à chaque élément que tu traite ensuite avec "Mid" ou "Replace" suivant le cas, ça devrait ce faire assez facilement.

    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

  10. #10
    Expert éminent
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 839
    Points : 9 222
    Points
    9 222
    Par défaut

    Avec un petit bricolage avec la fonction Replace
    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
    Option Explicit
    Dim Titre,fso,ws,NewLogFile,Resultat
    Titre = "Découpage de Chaînes"
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ws = CreateObject("Wscript.Shell")
    'Nom du fichier qui va stocker le résultat
    NewLogFile = Left(Wscript.ScriptFullName,InstrRev(Wscript.ScriptFullName, ".")) & "txt"
    if fso.FileExists(NewLogFile) Then 'Si le fichier LogFile existe 
    	fso.DeleteFile NewLogFile 'alors on le supprime
    end If
    MsgBox LireLogFile("Dhcp.log"),64,Titre
    Call WriteNewLogFile(LireLogFile("Dhcp.log"),NewLogFile)
    Resultat = ws.Run(NewLogFile,1,False)
    '**************************************************************************************
    Function LireLogFile(TextFile)
    Dim Msg,MyTab
    Msg = ""
    With CreateObject("Scripting.FileSystemObject").OpenTextFile(TextFile)
    		While .AtEndOfStream = False
    		LireLogFile = .ReadLine
    		LireLogFile = Replace(LireLogFile,"- ","*")
    		LireLogFile = Replace(LireLogFile," -","*")
    		LireLogFile = Replace(LireLogFile,"D-","*")
    		MyTab = Split(LireLogFile,"*")
    		Msg = Msg & "@IP = " & MyTab(0) & vbCrLf & "@Mask = " & MyTab(1) & vbCrLf &_
    		"@MAC = " & MyTab(2) & vbCrLf & "Date = " & MyTab(3) & vbCrLf & MyTab(4) & vbCrLf & "Domaine = " & MyTab(5) & vbCrLf & String(40,"*") & vbCrLf
    		Wend
    End With
    LireLogFile = Msg
    End Function
    '*****************************************************************
    'Fonction pour écrire le résultat dans un nouveau fichier texte
    Sub WriteNewLogFile(strText,NewLogFile)
    	Dim fs,ts 
    	Const ForAppending = 8
    	Set fs = CreateObject("Scripting.FileSystemObject")
    	Set ts = fs.OpenTextFile(NewLogFile,ForAppending,True)
    	ts.WriteLine strText
    	ts.Close
    End Sub
    '*****************************************************************

  11. #11
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    salut,

    une methode facile consiste a splitter en '-' puis joiner les tokens 2 à 7 de la MAC
    tu peux aussi les regexp:

    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
    phrase = "127.0.0.1    - 255.255.255.128- 00-86-9d-8d-48-3c   -27/10/2013 03:40:47    -D-  pc1.mon.domaine.fr"
     
    Set re= new Regexp
    re.global = True
    re.pattern = "^" & _
                 "\s*" & _
                 "(" & _
                     "[^ ]+" & _
                  ")" & _
                   "\s*-\s*" & _
                   "(" & _
                     "[^ ]+" & _
                   ")" & _
                   "\s*-\s*" & _
                   "(" & _
                     "(?:" & _
                        "[0-9a-f]{2}" & _
                        "-" & _
                      "){5}" & _
                      "(?:" & _
                         "[0-9a-f]{2}" & _
                      ")" & _
                    ")" & _
                    "\s*-\s*" & _
                    "(" & _
                      "(?:" & _
                         "[^ ]+" & _
                       ")" & _
                    "\s" & _
                       "(?:" & _
                          "[^ ]+" & _
                        ")" & _
                     ")" & _
                     "\s*-\s*" & _
                     "(" & _
                       "[^ ]+" & _
                     ")" & _
                     "\s*-\s*" & _
                     "(" & _
                       "[^ ]+" & _
                     ")" & _
                     "$"
     
    Set Matches = re.execute(phrase)
     
    Set Match = Matches(0)
     
    txt = "IP        = " & match.submatches(0) & vbCrLf _
    &     "MASK      = " & match.submatches(1) & vbCrLf _
    &     "MAC       = " & match.submatches(2) & vbCrLf _
    &     "DateTime  = " & match.submatches(3) & vbCrLf _
    &     "Type      = " & match.submatches(4) & vbCrLf _
    &     "Site      = " & match.submatches(5) & vbCrLf _
     
    msgBox txt

  12. #12
    Expert éminent
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 839
    Points : 9 222
    Points
    9 222
    Par défaut

    Ce matin un pote à moi Temp m'a envoyé ce code pour définir un nouveau délimiteur pour la conversion, d'ailleurs je le dois aussi l'idée du premier code avec la fonction Replace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    line="127.0.0.1    - 255.255.255.128- 00-86-9d-8d-48-3c   -27/10/2013 03:40:47    -D-  pc1.mon.domaine.fr"
    'Définir un nouveau délimiteur pour la conversion
    'ce que vous voulez, y compris une chaine, un espace ou un saut de ligne (vbCRLF)
    new_delimiter= "@"
    wscript.echo convert(line,new_delimiter)
    wscript.quit
     
    function convert(str,delim)
      Dim regEx
      Set regEx= New RegExp
      regEx.Pattern= " +- +| +-|- +"
      regEx.Global= True
      convert= regEx.Replace(str, delim)
    End Function

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

    Informations forums :
    Inscription : Février 2006
    Messages : 1 296
    Points : 3 549
    Points
    3 549
    Par défaut
    bonjour,
    sous réserve que netsh renvoie au minimum un espace avec le tiret séparateur des données (ce qui est vraisemblablement le cas), le script de temp est nickel
    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

  14. #14
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut
    Merci hackoofr, merci temp

    Avec un expression régulière c'est le top du top.

    Merci également à tout ceux qui ont contribué sur le sujet.

    Bonne journée.

  15. #15
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    Citation Envoyé par hackoofr Voir le message

    Ce matin un pote à moi Temp m'a envoyé ce code pour définir un nouveau délimiteur pour la conversion, d'ailleurs je le dois aussi l'idée du premier code avec la fonction Replace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    line="127.0.0.1    - 255.255.255.128- 00-86-9d-8d-48-3c   -27/10/2013 03:40:47    -D-  pc1.mon.domaine.fr"
    'Définir un nouveau délimiteur pour la conversion
    'ce que vous voulez, y compris une chaine, un espace ou un saut de ligne (vbCRLF)
    new_delimiter= "@"
    wscript.echo convert(line,new_delimiter)
    wscript.quit
     
    function convert(str,delim)
      Dim regEx
      Set regEx= New RegExp
      regEx.Pattern= " +- +| +-|- +"
      regEx.Global= True
      convert= regEx.Replace(str, delim)
    End Function
    salut,

    merci pour ta contribution puisque snorky94 a trouvé son bonheur avec ce code donc je crois que sa question est resolu
    du point de vue technique le pattern n'est pas générique et dépend fortement du nombre d'espaces générés
    je trouve qu"'un pattern plus générique sera plus fiable
    on peux aussi changé le code de snorky94 en lui ajoutant un petit bout de code pour avoir le resulat souhaité:

    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
    Phrase = "127.0.0.1      - 255.255.255.128- 00-86-9d-8d-48-3c    -27/10/2013 03:40:47    -D-   pc1.mon.domaine.fr"
     
     
     
    Tableau = Split(Phrase,"-")
    n=1
    For i = 2 to 7
       if n > 0 Then
         n = 0
       Else
         mac = mac & "-"
       End If
       mac = mac & Tableau(i)
    Next 
     
     
    ' Tableau(0)  Tableau(1)  mac  Tableau(8)  Tableau(9)  Tableau(10)

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/10/2007, 14h39
  2. Réponses: 4
    Dernier message: 19/10/2007, 09h46
  3. [Tableaux] Découpage de chaîne
    Par ssebuser dans le forum Langage
    Réponses: 10
    Dernier message: 21/12/2006, 17h12
  4. Découpage de chaînes
    Par innova dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 21/10/2006, 10h07
  5. [Débutant] Découpage de chaîne
    Par wkd dans le forum WinDev
    Réponses: 4
    Dernier message: 26/07/2006, 15h43

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