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 :

Script qui recupère des données dans un fichier texte et les insére dans un fichier excel


Sujet :

VBScript

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 62
    Points : 35
    Points
    35
    Par défaut Script qui recupère des données dans un fichier texte et les insére dans un fichier excel
    Bonjour a tous,
    je vous écris aujourd'hui pour un "petit" problème.
    Je m'explique: j'essaie depuis quelque jours de créer un script qui récupérerait des données dans un fichier txt ( ici dans un fichier de conf de switch ou routeur) et les inséreraient dans un fichier excel ( dans différentes colonnes selon le type de données ).
    J'avais bien avancé la dessus sauf que après avoir résolu les différents problèmes de variables, etc.. je me suis rendu compte a force de test que le script ne tournait pas du tout comme je pensais (hasard pour un débutant ).
    Le principal problème étant que pour parcourir un fichier txt j'ai utilisé la classe TextStream avec la méthode .AtEndOfStream qui est censée parcourir l'ensemble du fichier txt ligne par ligne.
    Sauf que lorsque j'ai crée mes "tests" (notamment celui qui m'affiche la ligne et le contenu de la ligne avec .ReadLine) j'ai constaté que le script ne parcourait pas ligne par ligne le fichier mais faisait des bond (ex: ligne 3 puis 7 puis 12, 13, etc) ainsi que le contenu de la ligne courante n'était pas complet.
    J'ai crée aussi une série de boucle If qui aurait du me permettre de classé les données voulues par un test simple en utilisant .Read(n) mais autre chose que je ne comprend pas .. des fois la boucle est prise en compte des fois non alors que le fichier de conf est le même pour chaque interface ..
    comme je l'ai dit étant débutant j'ai surement du faire une ( ou plusieurs :p ) erreur quelque part donc si quelqu'un pouvait m'aider a me faire comprendre ce que j'ai mal fait cela serait super sympa ^^ ( ou de me donner une alternative à TextStream pour parcourir un fichier )
    PS: pourtant je pense bien savoir lire
    Merci encore a tout ceux qui se pencheront sur mon problème ( je vous laisse le code ci dessous .. soyez indulgent j'ai surement des choses aberrantes pour certains :p )

    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
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    Option Explicit
     
    Dim pathout
    Dim objFso,objShell, objExcel
    Dim strcurrent
    Dim sCurPath,strCurTab,fTxtin,fTxtout,pathin,yligne
    Dim MessageToLog
     
    sCurPath = Replace(Wscript.ScriptFullName, Wscript.ScriptName, "")
     
    Public Const tagint = "interface"
    Public Const tagdesc = "description"
    Public Const tagvlan = " switchport access"
    Public Const tagmac = " switchport port-security mac-address sticky"
    Public Const R_ONLY = 1
    Public Const EVENT_SUCCESS = 0
    Public Const EVENT_ERROR = 1
    Public Const EVENT_WARNING = 2
     
     
    pathin = sCurPath & "test.xls"
    Set objShell = Wscript.CreateObject("Wscript.Shell")
     
    InitPath ()
    ' -------------------------------------
    ' Ouverture du Fichier destination
    ' -------------------------------------
    Set objFso = CreateObject ("scripting.filesystemobject")
    Set objExcel=CreateObject("Excel.Application")
    If Not (objFso.FileExists(pathin)) Then
     
    	MessageToLog = "Fichier destination pour copie : " & "Le fichier n'existe pas !" 
            objShell.LogEvent EVENT_ERROR, MessageToLog
    	objFso = Nothing
    	Wscript.Quit
    End If
     
    Set fTxtin = objExcel.workbooks.open(pathin)
    objExcel.visible=true
    msgbox(pathout)
    ' -------------------------------------
    ' Ouverture du Fichier source
    ' -------------------------------------
     
    Set objFso = CreateObject ("scripting.filesystemobject")
    If Not (objFso.FileExists(pathout)) Then
     
    	MessageToLog = "Fichier source pour copie : " & "Le fichier n'existe pas !" 
            objShell.LogEvent EVENT_ERROR, MessageToLog
    '	objFso = Nothing
    	Wscript.Quit
    End If
     
    Set fTxtout = objFso.OpenTextFile(pathout,R_ONLY)
     
    call RecupVal
     
     
     
    '################################################
    Sub RecupVal
     
    msgbox("coucou")
     
    fTxtin.worksheets(1).cells(1,1)=tagint
    fTxtin.worksheets(1).cells(1,2)=tagdesc
    fTxtin.worksheets(1).cells(1,3)="Vlan"
    fTxtin.worksheets(1).cells(1,4)="ADD MAC"
     
    dim curr
     
    While Not fTxtout.AtEndOfStream 
    	yligne=2	
    	curr=fTxtout.Line
    	wscript.echo fTxtout.ReadLine
    	msgbox("ligne courante: " & curr)
     
    	If fTxtout.Read(10)=tagint then
    		msgbox("test1")
    		Call Copie (yligne,1,0)
    		msgbox("test2")
    	End If
    	If fTxtout.Read(12)=tagdesc then
    		MsgBox("test3")
    		Call Copie(yligne,2,0)
    	End If
    	If fTxtout.Read(18)=tagvlan then
    		MsgBox("copie4")
    		Call Copie(yligne,3,2)
    	End If
    	If fTxtout.Read(44)=tagmac then
    		MsgBox("test5")
    		fTxtout.Skip(1)
    		Msgbox("test6")
    		Call Copie(yligne,4,1)
    	End If
    	msgbox("fin boucle")
    	yligne=yligne + 1
    Wend
    	msgbox("fin")
    	fTxtin.Close()
    	fTxtout.Close()
    End sub
    '################################################
     
     
    '################################################
     
    Sub InitPath ()
     
    	pathout = inputbox ("chemin du fichier voulu","Chemin de conf EAR")
     
    End Sub			
     
    '################################################
     
    Sub Copie (yligne,xcell,nTab)
    	msgbox("place du tableau" & nTab)
    	strcurrent = fTxtout.ReadLine()
    	msgbox("dans strcurrent;" & strcurrent)
    	strCurTab = Split(strcurrent, " ")
    	msgbox("dans le tableau" & strCurTab(nTab))
    	fTxtin.worksheets(1).Cells(yligne,xcell)=strCurTab(nTab)
     
    End Sub
    Edit: en continuant mes test sur un autre script je viens de remarquer que lorsque l'action arrive sur "wscript.echo fTxtout.ReadLine" cela me sors bien la première ligne du txt ( la ligne courante ) et lorsque je commence la "Sub Copie" je refait un fTxtout.ReadLine() et là, la ligne qui est envoyé dans ma MsgBox est la ligne suivante ..donc la méthode .Readline fait un saut de ligne après avoir été exécutée .. affaire à suivre mais je suis toujours preneur de remarque sur tout et n'importe quoi sur mon code

    Edit 2: j'ai fais quelques modifications et autres tests .. déja j'ai viré l'init de yligne dans la boucle ( oui pas très malin .. ) et sinon en travaillant sur mon 2 eme script et en le poussant un peu plus j'ai remarqué que ça fonctionnait comme il fallait :j'avais crée un fichier texte avec des nom et prénom une ligne sur deux et le script les récupérait bien et les mettaient dans la bonne colonne.
    Par contre lorsque j'ai voulu tester en mettant des lignes vides ou des "!" ( comme des les conf cisco) entre chaque nom j'ai retrouvé mon problème de bonds aléatoire.. donc en fait maintenant il faudrait que je trouve un moyen de gérer ces exceptions afin que mon fichier soit lu normalement .

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 62
    Points : 35
    Points
    35
    Par défaut
    Re bonjour, après avoir fait encore de nombreux test .. je n'arrive à rien .. j'ai essayé de gérer les exceptions avec la méthode Instr qui m'aurait permit de rentrer dans mes boucles If seulement lorsque la valeur de Instr était différente de 0 mais ca ne marchait pas .. ensuite j'ai testé avec la méthode Len et Left sauf que cela ne marchait pas non plus ( et de plus j'avais besoin d'initialiser ma variable strcurrent qui est censée contenir le ligne en cours .. mais lorsque je le faisais ma boucle faisait encore une fois des sauts de ligne .. ).. Et enfin là, je suis en train de testeré avec la methode EOF ..sauf que malgré les différentes discussions ouvertes à ce sujet ( sur ce site et le net ..) je n'arrive pas à la faire fonctionner ..si une âme charitable pouvait me donner un coup de main la-dessus se serait super sympa car là je commence vraiment à saturer
    merci d'avance (encore :p )

  3. #3
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 115
    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 115
    Points : 15 673
    Points
    15 673
    Par défaut
    Salut

    pour ta persévérance malgré l'absence d'aide.
    Pour le se qui concerne un ReadLine, tu peux mettre sont contenu dans une variable MaPhrase = fTxtout.ReadLine, cela permet de manipuler/modifier la ligne au niveau variable, car comme tu l'as constaté un ReadLine suivant passe à la ligne suivante du fichier.

    Une piste, la fonction RepLace permet de modifier un ou plusieurs caractères, c'est peut être une solution possible pour tes "!"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim MaVariable
    MaVariable = "coucou"
    MaVariable = Replace(MaVariable, "c", "t", 1, , vbTextCompare)
    MsgBox MaVariable 'MaVariable contient maintenant toutou
    Une autre piste (peut être complémentaire) tester la fin de ligne avec vbNewLine (Caractère de saut de ligne spécifique à la plate-forme).

    Bonne continuation dans tes essais.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 62
    Points : 35
    Points
    35
    Par défaut
    merci beaucoup pour le message je commencais a deseperer ^^
    je vais tester ce que tu m'as dit mais pour le Replace je ne pense pas que ca fonctionne (j'avais deja essayé en changeant le caractère .. et .. FAIL )
    sinon je suis en train de tester le Select Case mais j'ai encore quelque petit soucis pour rentrer dans les Case je vais tenter tout ca et au pire je referai un petit poste avec le code
    merci encore

  5. #5
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2011
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2011
    Messages : 163
    Points : 304
    Points
    304
    Par défaut
    Salut !

    A ta place je commencerais par reformater ton fichier texte dans un fichier temporaire.

    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
    Const ForReading = 1, ForWriting = 8
    Dim oFSO, Fichier_ori, Fichier_tmp, Var_tmp
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Fichier_origine = "Fichier.txt"
    Fichier_tmp = "Fichier_tmp.txt"
    Set Var_tmp = oFSO.CreateTextFile(Fichier_tmp) : Var_tmp.close
    Set lect = oFSO.OpenTextFile(Fichier_origine, ForReading)
    Set ecr = oFSO.OpenTextFile(Fichier_tmp, ForWriting)
    While Not lect.AtEndOfStream
    Texte = lect.ReadLine
    Texte = Trim(Texte) 'Supprime les espace en début et fin de lignes
    If len(Texte) > 0 Then 'Test ligne non-vide (ou autres critères de ton choix)
    ecr.WriteLine Texte
    End if
    Wend
    lect.close
    ecr.close
    Et aprés tu fais ton traitement sur le fichier temporaire ... avant de l'effacer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If oFSO.FileExists(Fichier_tmp) Then oFSO.DeleteFile Fichier_tmp, True

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 62
    Points : 35
    Points
    35
    Par défaut
    Coucou tout le monde et merci pour la reponse Catchlab mais c'est bon je suis arrivé a faire fonctionner mon script

    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
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    Option Explicit
     
    Dim pathout,pathin
    Dim objFso,objShell, objExcel
    Dim strcurrent
    Dim sCurPath,strCurTab,fTxtin,fTxtout,yxcl
    Dim MessageToLog
    Dim lentagint,lentagdesc,lentagvlan,lentagmac,lentagtrunk
    Dim valtag,temp,tempbis,linecurr,desc
     
    sCurPath = Replace(Wscript.ScriptFullName, Wscript.ScriptName, "")
     
    Public Const tagint =  "interface" 
    Public Const tagdesc = " description"
    Public Const tagvlan = " switchport access"
    Public Const tagmac = " switchport port-security mac-address sticky"
    Public Const tagtrunk =" switchport trunk allowed vlan" 
    Public Const R_ONLY = 1
    Public Const EVENT_SUCCESS = 0
    Public Const EVENT_ERROR = 1
    Public Const EVENT_WARNING = 2
     
    lentagint = Len(tagint)
    lentagdesc = Len(tagdesc)
    lentagvlan = Len(tagvlan)
    lentagmac = Len(tagmac)
    lentagtrunk=Len(tagtrunk)
     
    pathin = sCurPath & "test.xls"
    Set objShell = Wscript.CreateObject("Wscript.Shell")
     
    InitPath ()
    ' -------------------------------------
    ' Ouverture du Fichier destination
    ' -------------------------------------
    Set objFso = CreateObject ("scripting.filesystemobject")
    Set objExcel=CreateObject("Excel.Application")
    If Not (objFso.FileExists(pathin)) Then
     
    	MessageToLog = "Fichier destination pour copie : " & "Le fichier n'existe pas !" 
            objShell.LogEvent EVENT_ERROR, MessageToLog
    	objFso = Nothing
    	Wscript.Quit
    End If
     
    Set fTxtin = objExcel.workbooks.open(pathin)
    objExcel.visible=true
    msgbox(pathout)
    ' -------------------------------------
    ' Ouverture du Fichier source
    ' -------------------------------------
     
    Set objFso = CreateObject ("scripting.filesystemobject")
    If Not (objFso.FileExists(pathout)) Then
     
    	MessageToLog = "Fichier source pour copie : " & "Le fichier n'existe pas !" 
            objShell.LogEvent EVENT_ERROR, MessageToLog
    '	objFso = Nothing
    	Wscript.Quit
    End If
     
    Set fTxtout = objFso.OpenTextFile(pathout,R_ONLY)
     
    call RecupVal
     
     
     
    '################################################
    Sub RecupVal
     
     
     
    fTxtin.worksheets(1).cells(1,1)=tagint
    fTxtin.worksheets(1).cells(1,2)=tagdesc
    fTxtin.worksheets(1).cells(1,3)="Vlan"
    fTxtin.worksheets(1).cells(1,4)="ADD MAC"
    fTxtin.worksheets(1).cells(1,5)="TRUNK"
     
    yxcl=2
    While Not fTxtout.AtEndOfStream 
     
    	if left(strcurrent,lentagint) = tagint then valtag=1
    	if left(strcurrent,lentagdesc) = tagdesc then valtag=2
    	if left(strcurrent,lentagvlan) = tagvlan then valtag=3
    	if left(strcurrent,lentagmac) =tagmac then valtag=4
    	if left(strcurrent,lentagtrunk)=tagtrunk then 
    			valtag=5
    			msgbox("valtag=5")
    	end if		
    	if left(strcurrent,lentagint) <> tagint AND left(strcurrent,lentagdesc) <> tagdesc AND left(strcurrent,lentagvlan) <> tagvlan AND left(strcurrent,lentagmac)<> tagmac AND left(strcurrent,lentagtrunk)<>tagtrunk then valtag=0
    	Select Case valtag
    		case 1		
    			Call Copie (yxcl,1,1)
    			valtag = 0
    		case 2
    			Call Copie(yxcl,2,2)
    			valtag = 0
    		case 3
    			Call Copie(yxcl,3,4)
    			valtag = 0
    		case 4
    			Call Copie(yxcl,4,5)
    			valtag = 0
    			yxcl=yxcl+1
    		case 5
    			msgbox("trunk")
    			Call Copie(yxcl,5,5)
    			valtag = 0
    			yxcl=yxcl+1
    		case else 
    			strcurrent=fTxtout.ReadLine()
    	end select 
     
     
    Wend
    	msgbox("fin")
    	fTxtin.Close()
    	fTxtout.Close()
    End sub
    '################################################
     
     
    '################################################
     
    Sub InitPath ()
     
    	pathout = inputbox ("chemin du fichier voulu","Chemin de conf EAR")
     
    End Sub			
     
    '################################################
     
    Sub Copie (yxcl,xcell,nTab)
     
    	if fTxtout.Line = 1 then strcurrent = fTxtout.ReadLine()
     
    	if nTab = 5  AND valtag =4 then
     
     
    		fTxtin.worksheets(1).Cells(yxcl,xcell)=Right(strcurrent,14)
    		if fTxtin.worksheets(1).Cells(yxcl - 1,xcell)="address sticky" and tempbis=1 then 
    			fTxtin.worksheets(1).Cells(yxcl-1,xcell)=Right(strcurrent,14)
    			fTxtin.worksheets(1).Cells(yxcl,xcell)=""
    			tempbis=0
    		else tempbis=1
    		end if
    	else
     
    	strCurTab = Split(strcurrent, " ")
    	'msgbox("dans le tableau : " & strCurTab(nTab))
    	fTxtin.worksheets(1).Cells(yxcl,xcell)=strCurTab(nTab)
    	end if 
     
    	If nTab= 4 then
    		if strCurTab(nTab) = "300" then
    			yxcl = yxcl + 1 
    				dim i
    				For i = 1 to 5
    					fTxtout.ReadLine()
    				Next
    		end if
    	end if
     
     
    	If nTab=1 then if left(strCurTab(nTab),8)="Loopback"  then yxcl = yxcl + 1
    	If nTab=1 then
     
    		if left(strCurTab(nTab),4)="Vlan" then 
    		temp=1
    		msgbox("avant temp: " &strcurrent)
    		msgbox("temp=1")
    		end if
    	end if
    	If temp=1 AND left(strcurrent,lentagdesc)=tagdesc then
    		yxcl =yxcl + 1
    		temp = 0
    		desc=1
    		msgbox("tag")
    		msgbox("dans 1ere boucle: "&strcurrent)
    	End if
    	If temp=1 AND desc <> 1 AND left(strcurrent,lentagdesc)<>tagdesc then 
    		msgbox("desc")
    		msgbox("dans 2eme boucle :" & strcurrent)
    		yxcl = yxcl + 1
    		temp = 0
    		desc=0
    	End if
     
     
    	strcurrent = fTxtout.ReadLine()
     
     
    End Sub
    La solution était bien avec le Select Case !

    Du coup pour l'instant ce script ne fonctionne qu'avec les conf de routeur CISCO ( il y a juste un "petit soucis" lors de la récupération des descriptions des VLAN : il y a un saut de ligne qui les décale et je n'arrive pas à déterminer de où cela peut provenir ..mais bon après c'est rien de grave :p . Si quelqu'un a la solution se serait cool mais c'est juste du peaufinage ^^ )
    Apres pour les conf des routeur / switch d'autres marque je pense qu'il n'y aura juste que quelques ajustements à faire.

    et Sinon si certaines personnes on des amélioration a me proposer je suis preneur j'imagine bien que des gens plus expérimenté doivent trouver ce code un peu basique :p

    Merci à tout le monde pour l'aide fournit je considère ce post résolu. (pas trop tôt)
    A bientôt

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/03/2010, 17h01
  2. Réponses: 2
    Dernier message: 06/04/2009, 17h44
  3. Réponses: 2
    Dernier message: 22/06/2008, 16h41
  4. Réponses: 5
    Dernier message: 21/02/2007, 17h12
  5. Réponses: 2
    Dernier message: 29/05/2006, 00h31

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