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

  1. #1
    Nouveau Candidat au Club
    lire et exploiter des données, les parser, puis copier les infos dans excel
    Bonsoir la communauté,

    je viens à vous car je sèche malheureusement !

    Je cherche à exploiter un fichier texte qui comporte pas mal de données peu importante, pour extraire uniquement les données contenu dans le champ hostname et IP
    le texte est du genre comme cela
    hostname= 0RTKEJTLEJRTGE,blueblueblueblue,IP=192.168.1.1,blablablabla,bloblobloblo,blibliblibli,...
    hostname= 0RTKEJTLEJRREE,blueblueblueblue,IP=192.168.1.2,blablablabla,bloblobloblo,blibliblibli,...
    hostname= 0RTKEJTLEJEFZZ,blueblueblueblue, IP=192.168.1.3,blablablabla,bloblobloblo,blibliblibli,...
    hostname= 0RTKEJTLEJZEFZ,blueblueblueblue,IP=192.168.1.4,blablablabla,bloblobloblo,blibliblibli,...

    la tache devra s'executer de manière implicite sans ouverture de fenetre et exporter les données sur un fichier excel en séparant par deux colonnes distincts genre
    colonnes A, tous les hostmane recensés dans mon fichier source, et dans la colonne B tous les ips consecutives.
    l'idée et d'automatiser mon petit parc informatique.
    vous remerciant davance

  2. #2
    Modérateur

    Bonjour et BIENVENU sur DVP;

    Si toutes les lignes du fichier texte se présentent sous la même forme, il faudra donner une ligne complète pour pouvoir décider de la façon dont on traitera le fichier, notamment pour voir s'il y a d'autres signes "=" dans chaque ligne; ce qui facilitera le traitement.
    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

  3. #3
    Nouveau Candidat au Club
    Citation Envoyé par l_autodidacte Voir le message
    Bonjour et BIENVENU sur DVP;

    Si toutes les lignes du fichier texte se présentent sous la même forme, il faudra donner une ligne complète pour pouvoir décider de la façon dont on traitera le fichier, notamment pour voir s'il y a d'autres signes "=" dans chaque ligne; ce qui facilitera le traitement.
    Je confirme, le document source est formaté de cette manière là.
    ce que je recherche c'est de recupérer la première valeur derrière le premier égal pour la déplacer dans une colonne excel sous le nom de la rubrique hostname et la seconde // // // // // sous la rubrique IP
    merci bien

  4. #4
    Rédacteur

    bonjour,

    bienvenue dans les caves du donjon de DVP
    un exemple de conversion de ton fichier en format csv directement importable sous Excel
    bien sûr, il est aussi possible de créer dans le script une instance d'Excel et d'injecter directement les données dans une feuille (il faudra juste une petite modif du pattern)
    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
    Option explicit
    Dim fso, file, sRtf, reg, matches, match
     
    ' lecture contenu fichier
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set file = fso.OpenTextFile("sample01.txt",1,false)
    sRtf = file.ReadAll
    file.Close
     
    ' parsing regexp
    Set reg = New RegExp 
    reg.Pattern = "(^|\n)hostname=(.*,).*,.*IP=([^,]*)"
    reg.IgnoreCase = True
    reg.Global = True
    Set matches = reg.Execute(sRtf)
    Set file = fso.OpenTextFile("sample01.csv",2,true)
    For Each match In matches
      file.WriteLine match.SubMatches(1) & match.SubMatches(2)
    Next
    file.Close
    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

  5. #5
    Modérateur

    Une autre possibilité en utilisant un fichier .xls ou .xlsx (sans utiliser les RegExp, pourtant plus concis) :
    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
    Option Explicit 
     
    Const ForReading = 1, ForWriting = 2, ForAppending = 8 
    Const xlCenter = -4108 
    Dim fso, Fich, Ret, IP, Host, TB, I, oXL, WBK, Sht, Ligne
     
    Set fso = CreateObject("Scripting.FileSystemObject") 
    Set fich = fso.OpenTextFile("Source.txt", ForReading, False) 
     
    Set oXL = CreateObject("Excel.Application")
    oXL.Visible = False
    Set WBK = oXL.WorkBooks.Add()
    Set Sht = WBK.Worksheets(1)
    Sht.Columns(1).ColumnWidth = 18
    Sht.Range("A1","B1").HorizontalAlignment = xlCenter
    Sht.Cells(1,1) = "HOSTNAME"
    Sht.Cells(1,2) = "IP"
    Ligne = 0
    Do While Not fich.AtEndOfStream
       Ret = fich.ReadLine
       TB = Split(Ret, ",")
       For I = LBound(TB) To UBound(TB)
           TB(I) = Trim(TB(I))
           If InStr(1, TB(I), "hostname=", vbTextCompare) > 0 Then 
              Host = Mid(TB(I),10)
              Ligne = Ligne + 1
              Sht.Cells(1+Ligne,1) = Host
            ElseIf InStr(1, TB(I), "IP=", vbTextCompare) > 0 Then 
              IP = Mid(TB(I),4)
              Sht.Cells(1+Ligne,2) = IP
           End If
       Next
    Loop
    oXL.DisplayAlerts = False
    WBK.SaveAs "C:\Temp\Dest.xlsx"
    ' Pour tester : 
    oXL.Visible = True ' A mettre en commentaire pour ne pas afficher excel
     
    ' Pour fermer excel(même s'il n'est pas visible), on enlève le commentaire des 4 lignes suivantes :
    ' oXL.Quit
    ' Set WBK = Nothing
    ' Set Sht = Nothing
    ' Set oXL = Nothing
    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

  6. #6
    Nouveau Candidat au Club
    Bonjour,

    On vient de me confirmer que le besoin est plus compliqué que cela.

    En gros le document est formaté de la manière suivante =>

    fichier texte

    hostname = toto
    hostname = tata
    hostname = titi
    hostname = tutu

    le but est que j'exporte sur xls de la manière suivante

    colonne 1 : colonne 2:
    Hostname IP
    toto resultat du nslookup avec recupération uniquement de l'ip

    Je vous remercie infiniment de votre aide

  7. #7
    Rédacteur

    je vois... mais s'il s'agit simplement d'alimenter nslookup avec un fichier texte contenant des hostnames pour en obtenir l'ip et créer en sortie un fichier csv, autant faire un batch.
    il y a un sous-forum pour ça
    sinon sur le net...
    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

  8. #8
    Nouveau Candidat au Club
    Malheureusement pour des raisons que j'ignore le batch est pas autorisé.

    Est ce possible de parser le fichier source, qui est desormais formater de la manière suivante

    hostname = nomdemachine

    et d'avoir en resultat sur un fichier excel où .txt en destination

    nomdemachine = 192.168.1.1

    j'ai trouvé un inputbox qui me fait le job en inserant le nomdemachine et me retourne le resultat mais je préfère soumettre l'ensemble du fichier et avoir le resultat si possible.

    merci beaucoup de votre assistance et votre compréhension à tous

  9. #9
    Rédacteur

    c'est toujours pénible d'interfacer un vbscript avec un utilitaire en ligne de commande aussi rustique que nslookup
    mais bon, ci-dessous un script qui crée à partir d'un fichier sample02.txt
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    hostname =opendns.com
    hostname=developpez.com
    hostname= mozilla.org
    hostname = opensource.org


    un fichier sample02.csv avec une seule colonne de la forme nomhost = IPv4
    la fenêtre de l'interpréteur de commande clignote mais c'est normal (pour l'éviter voir le hack dans ce post)
    (le 2ème pattern n'est pas parfait mais ça fait le taff)
    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
    Option explicit
    Dim fso, file, sRtf, reg, matches, match, shl, nsl, disp, ipmatches, ipmatch
     
    ' reading hostname data
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set file = fso.OpenTextFile("sample02.txt",1,false)
    sRtf = file.ReadAll
    file.Close
     
    ' regexp parsing
    Set reg = New RegExp 
    reg.Pattern = "(?:^|\n)hostname *= *([^\r]*)" '?: -> 1st match non captured
    reg.IgnoreCase = True
    reg.Global = True
    Set matches = reg.Execute(sRtf) 
     
    ' get ip data from nslookup
    Set shl=CreateObject("WScript.Shell")
    Set file = fso.OpenTextFile("sample02.csv",2,true)
    For Each match In matches
      Set nsl=shl.Exec("nslookup.exe " & match.SubMatches(0))
      Set disp=nsl.StdOut
      Do While nsl.Status = 0
        WScript.Sleep 100
      Loop
      reg.Pattern = "Address.*: (.*)[^0-9]\s(.*)"
      Set ipmatches = reg.Execute(disp.ReadAll)
      If Len(ipmatches(1).SubMatches(1)) = 0 Then
        file.WriteLine match.SubMatches(0) & " =" & Left(ipmatches(1).SubMatches(0),Len(ipmatches(1).SubMatches(0))-1)
      Else
        file.WriteLine match.SubMatches(0) & " =" & Left(ipmatches(1).SubMatches(1),Len(ipmatches(1).SubMatches(1))-1)
      End If
    Next
    file.Close
    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
    Nouveau Candidat au Club
    Citation Envoyé par soja78260 Voir le message

    Le message exact de la fenetre windows est argument ou appel de procédure incorrect
    Ligne 30 caractère 3
    donc cela fait appel à ce bout de code, If (ipmatches(1).SubMatches(1)) = 0 Then .
    merci

  11. #11
    Rédacteur

    ah oui avec la gestion des hosts introuvables :
    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
    Option explicit
    Dim fso, file, sRtf, reg, matches, match, shl, nsl, disp, ipmatches, ipmatch
     
    ' reading hostname data
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set file = fso.OpenTextFile("sample02.txt",1,false)
    sRtf = file.ReadAll
    file.Close
     
    ' regexp parsing
    Set reg = New RegExp 
    reg.Pattern = "(?:^|\n)hostname *= *([^\r]*)" '?: -> 1st match non captured
    reg.IgnoreCase = True
    reg.Global = True
    Set matches = reg.Execute(sRtf) 
     
    ' get ip data from nslookup
    Set shl=CreateObject("WScript.Shell")
    Set file = fso.OpenTextFile("sample02.csv",2,true)
    For Each match In matches
      Set nsl=shl.Exec("nslookup.exe " & match.SubMatches(0))
      Set disp=nsl.StdOut
      Do While nsl.Status = 0
        WScript.Sleep 100
      Loop
      reg.Pattern = "Address.*: (.*)[^0-9]\s(.*)"
      Set ipmatches = reg.Execute(disp.ReadAll)
      If ipmatches.Count > 1 Then
        If Len(ipmatches(1).SubMatches(1)) = 0 Then
          file.WriteLine match.SubMatches(0) & " =" & Left(ipmatches(1).SubMatches(0),Len(ipmatches(1).SubMatches(0))-1)
        Else
          file.WriteLine match.SubMatches(0) & " =" & Left(ipmatches(1).SubMatches(1),Len(ipmatches(1).SubMatches(1))-1)
        End If
      Else
        file.WriteLine match.SubMatches(0) & " = introuvable"
      End If
    Next
    file.Close
    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

  12. #12
    Rédacteur

    juste pour le fun, la version définitive plus concise et plus propre :
    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
    Option explicit
    Dim fso, file, sRtf, reg, matches, match, shl, nsl, disp, ipmatches, ipmatch
     
    ' reading hostname data
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set file = fso.OpenTextFile("sample02.txt",1,false)
    sRtf = file.ReadAll
    file.Close
     
    ' hostname regexp parsing
    Set reg = New RegExp 
    reg.Pattern = "(?:^|\n)hostname *= *([^\r]*)" '?: -> 1st match non captured
    reg.IgnoreCase = True
    reg.Global = True
    Set matches = reg.Execute(sRtf) 
     
    ' get ip data from nslookup and set file data
    Set shl=CreateObject("WScript.Shell")
    Set file = fso.OpenTextFile("sample02.csv",2,true)
    For Each match In matches
      Set nsl=shl.Exec("nslookup.exe " & match.SubMatches(0))
      Set disp=nsl.StdOut
      Do While nsl.Status = 0
        WScript.Sleep 100
      Loop
      reg.Pattern = "Address.*: (.*)[^0-9]\s(.*)\r\n"
      Set ipmatches = reg.Execute(disp.ReadAll)
      If ipmatches.Count > 1 Then
        file.WriteLine match.SubMatches(0) & " = " & LTrim(ipmatches(1).SubMatches(Len(ipmatches(1).SubMatches(1)) And 1))
      Else
        file.WriteLine match.SubMatches(0) & " = introuvable"
      End If
    Next
    file.Close
    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