Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

récupération de données dans un fichier

13 réponses
Avatar
moratella
Bonjour, j'ai différents travaux à faire dans des fichiers.
Martin Clavreuil, que je remercie encore, m'a donné ces lignes pour lire
dans un fichier de type:
nom_serveur1; nom-imprimantesX
nom_serveur2;nom_imprimantesZ
nom_serveur3; nom_imprimanteG...

Nom_Imprimante=split(split(Contenu_Fichier,vbcrlf & Nom_Machine &
";")(1),vbcrlf)(0)
qui permet en fonction du nom_machine de récuperer le nom de l'imprimante.
J'avoue ne pas comprendre le focntionnement de la fonction Split.
Comment devrais je procéder afin d'obtenir dans 3 variables le contenue
d"'une ligne.
Je m'explique: j'ai un autre fichier ayant 4 colonnes:
nom_serveur1; type_imprimanteA;nom_imprimanteX;adresse_IP
nom_serveur2; type_imprimanteB;nom_imprimanteZ;adresse_IP
...
en fonction du nom de serveur que je connais, j'aimerais récupérer dans var1
le type_imprimante, dans var2 le nom_imprimante et dans var3 l'adresse IP.

J'ai fait différents tests afin d'exploiter la focntion Split mais je ne
débouche sur rien de concret.
Merci d'avance de vos idées
Raphaël

10 réponses

1 2
Avatar
~Jean-Marc~
Salutations *moratella* !
Dans <news:
tu nous disais :

J'ai fait différents tests afin d'exploiter la focntion Split mais je
ne débouche sur rien de concret.


La fonction split renvoie un Array.

Exemple vite fait :

Test = "Machine1;Machine2;Machine3"

StrArrayTemp = split(Test, ";")

for i = 0 to Ubound(StrArrayTemp)

MsgBox StrArrayTemp(i)

next

Va renvoyer 3 MsgBox avec les 3 chaines :

Machine1
Machine2
Machine3

successivement.

Voilà, je pense que ça devrait être plus clair comme ça ;-)

(par contre, je ne sais pas si on peut faire un split sur un vbcrlf)

@+

--
~Jean-Marc~
Contact : http://msmvps.com/docxp/contact.aspx
Site : http://perso.wanadoo.fr/doc.jm/ http://docxp.mvps.org
WebLog : http://msmvps.com/docxp/

Avatar
~Jean-Marc~ [MVP]
Salutations *~Jean-Marc~* !
Dans <news:
tu nous disais :
(par contre, je ne sais pas si on peut faire un split sur un vbcrlf)


Correction : on peut !

Test = "Machine1" & vbcrlf & "Machine2" & vbcrlf & "Machine3"

StrArrayTemp = split(Test, vbcrlf)

for i = 0 to Ubound(StrArrayTemp)

MsgBox StrArrayTemp(i)

next

@+

--
~Jean-Marc~ MSAE & MVP Windows XP Fr
M'écrire : http://msmvps.com/docxp/contact.aspx
- http://docxp.mvps.org - http://msmvps.com/docxp/ -
Aide en DIRECT sur Internet : http://communautes-ms.akro-net.org/

Avatar
moratella
Bonjour et merci pour ces informations.
Suite à vos indications, je ne sais pas si cette fonction est la plus
adaptée à mes besoins.
Peut être auriez vous une autre piste pour aborder mon problème:
je dispose d'un fichier à 4 colonnes
(nom_serveur1;type_imprimanteA;nom_imprimanteXXX;adresse_ip
nom_serveur2;type_imprimanteB;nom_imprimanteYYY;adresse_ip
nom_serveur1;type_imprimanteB;nom_imprimanteZZZ;adresse_ip...)

en fonction du nom_serveur que je connais je dois récupérer dans des
variables les 3 autres champs sachant qu'il peut il y avoir plusieur fois
présent le nom_serveur.
Donc je dois parcourir l'ensemble du fichier et à chaque fois que je croise
le nom_serveur en entrée, je dois ranger les 3 autres champs qui suivent dans
des variables puis faire une opération et recommencer jusqu'à la fin du
fichier.
J'arrive à récuperer un champs mais pas trois.
En tout cas je vous remercie pour votre intervention
Raphaël

"~Jean-Marc~ [MVP]" wrote:

Salutations *~Jean-Marc~* !
Dans <news:
tu nous disais :
(par contre, je ne sais pas si on peut faire un split sur un vbcrlf)


Correction : on peut !

Test = "Machine1" & vbcrlf & "Machine2" & vbcrlf & "Machine3"

StrArrayTemp = split(Test, vbcrlf)

for i = 0 to Ubound(StrArrayTemp)

MsgBox StrArrayTemp(i)

next

@+

--
~Jean-Marc~ MSAE & MVP Windows XP Fr
M'écrire : http://msmvps.com/docxp/contact.aspx
- http://docxp.mvps.org - http://msmvps.com/docxp/ -
Aide en DIRECT sur Internet : http://communautes-ms.akro-net.org/





Avatar
~Jean-Marc~ [MVP]
Salutations *moratella* !
Dans <news:
tu nous disais :
Bonjour et merci pour ces informations.
Suite à vos indications, je ne sais pas si cette fonction est la plus
adaptée à mes besoins.
Peut être auriez vous une autre piste pour aborder mon problème:
je dispose d'un fichier à 4 colonnes
(nom_serveur1;type_imprimanteA;nom_imprimanteXXX;adresse_ip
nom_serveur2;type_imprimanteB;nom_imprimanteYYY;adresse_ip
nom_serveur1;type_imprimanteB;nom_imprimanteZZZ;adresse_ip...)

en fonction du nom_serveur que je connais je dois récupérer dans des
variables les 3 autres champs sachant qu'il peut il y avoir plusieur
fois présent le nom_serveur.
Donc je dois parcourir l'ensemble du fichier et à chaque fois que je
croise le nom_serveur en entrée, je dois ranger les 3 autres champs
qui suivent dans des variables puis faire une opération et
recommencer jusqu'à la fin du fichier.
J'arrive à récuperer un champs mais pas trois.


C'est possible d'avoir le bout de code concerné, ainsi qu'une exemple de
fichier ? (5 ou 6 lignes, c'est juste pour tester)

@+

--
~Jean-Marc~ MSAE & MVP Windows XP Fr
M'écrire : http://msmvps.com/docxp/contact.aspx
- http://docxp.mvps.org - http://msmvps.com/docxp/ -
Aide en DIRECT sur Internet : http://communautes-ms.akro-net.org/

Avatar
Fred
Dans le message:,
Bonjour et merci pour ces informations.
Suite à vos indications, je ne sais pas si cette fonction est la plus
adaptée à mes besoins.
Peut être auriez vous une autre piste pour aborder mon problème:
je dispose d'un fichier à 4 colonnes
(nom_serveur1;type_imprimanteA;nom_imprimanteXXX;adresse_ip
nom_serveur2;type_imprimanteB;nom_imprimanteYYY;adresse_ip
nom_serveur1;type_imprimanteB;nom_imprimanteZZZ;adresse_ip...)

en fonction du nom_serveur que je connais je dois récupérer dans des
variables les 3 autres champs sachant qu'il peut il y avoir plusieur
fois présent le nom_serveur.
Donc je dois parcourir l'ensemble du fichier et à chaque fois que je
croise le nom_serveur en entrée, je dois ranger les 3 autres champs
qui suivent dans des variables puis faire une opération et
recommencer jusqu'à la fin du fichier.
J'arrive à récuperer un champs mais pas trois.
En tout cas je vous remercie pour votre intervention
Raphaël

"~Jean-Marc~ [MVP]" wrote:

Salutations *~Jean-Marc~* !
Dans <news:
tu nous disais :
(par contre, je ne sais pas si on peut faire un split sur un vbcrlf)


Correction : on peut !

Test = "Machine1" & vbcrlf & "Machine2" & vbcrlf & "Machine3"

StrArrayTemp = split(Test, vbcrlf)

for i = 0 to Ubound(StrArrayTemp)

MsgBox StrArrayTemp(i)

next

@+

--
~Jean-Marc~ MSAE & MVP Windows XP Fr
M'écrire : http://msmvps.com/docxp/contact.aspx
- http://docxp.mvps.org - http://msmvps.com/docxp/ -
Aide en DIRECT sur Internet : http://communautes-ms.akro-net.org/



Bonjour,
Pour un tel fichier, l'utilisation d'une connexion type base de données
pourrait te simplifier la tâche.
exemple :
8<------------------------
Set oConnection=createObject( _
"ADODB.Connection")
oConnection.Open _
"Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
"Dbq=c:;" & _
"Extensions=asc,csv,tab,txt"

Set oRecordSet = oConnection.Execute( _
"SELECT * FROM source.csv " & _
"WHERE srv='nom_serveur1'")

While Not oRecordSet.EOF
MsgBox oRecordSet("srv")
oRecordSet.MoveNext
Wend
oConnection.Close
8<---------------------------

J'ai simplement ajouté une ligne d'en-tête au dessus des trois lignes que tu
donnes en exemple.
Le fichier texte ainsi obtenu est enregistré à la racine du lecteur c: sous
le nom 'source.csv'.
'srv' correspond au nom de la première colonne.
On peut faire les choses un peu plus rigoureusement en utilisant les objets
de type 'parameter' mais je pense que cela suffira ainsi dans ton cas.

Fais attention au cas où les lignes de l'exemple seraient coupées. Je les ai
raccourci mais sait-on jamais.

--
Fred



Avatar
moratella
Fred, Jean-Marc,
Je vous remercie de l'intérêt que vous portez à mon problème.

Jean-marc as tu reçu mon mail avec les sources du script et le fichier txt ?
je suis passé par l'adresse http://msmvps.com/docxp/contact.aspx

Fred, merci pour ta nouvelle orientation.
Si j'ai bien compris srv est l'entête de ma première colonne, mais comment
j'accede à la suite de l'enregistrement (les trois autres colonnes).
en faite je ne désire pas les afficher mais les rentrer dans 3 variables
distinctes afin d'effectuer une opération derrière (installation d'une
imprimante en locale via un outil) (respectivement type_imprimante,
nom_imprimante et adresse_ip)

En tout cas merci pour tout à vous deux
Raphaël



Dans le message:,
Bonjour et merci pour ces informations.
Suite à vos indications, je ne sais pas si cette fonction est la plus
adaptée à mes besoins.
Peut être auriez vous une autre piste pour aborder mon problème:
je dispose d'un fichier à 4 colonnes
(nom_serveur1;type_imprimanteA;nom_imprimanteXXX;adresse_ip
nom_serveur2;type_imprimanteB;nom_imprimanteYYY;adresse_ip
nom_serveur1;type_imprimanteB;nom_imprimanteZZZ;adresse_ip...)

en fonction du nom_serveur que je connais je dois récupérer dans des
variables les 3 autres champs sachant qu'il peut il y avoir plusieur
fois présent le nom_serveur.
Donc je dois parcourir l'ensemble du fichier et à chaque fois que je
croise le nom_serveur en entrée, je dois ranger les 3 autres champs
qui suivent dans des variables puis faire une opération et
recommencer jusqu'à la fin du fichier.
J'arrive à récuperer un champs mais pas trois.
En tout cas je vous remercie pour votre intervention
Raphaël

"~Jean-Marc~ [MVP]" wrote:

Salutations *~Jean-Marc~* !
Dans <news:
tu nous disais :
(par contre, je ne sais pas si on peut faire un split sur un vbcrlf)


Correction : on peut !

Test = "Machine1" & vbcrlf & "Machine2" & vbcrlf & "Machine3"

StrArrayTemp = split(Test, vbcrlf)

for i = 0 to Ubound(StrArrayTemp)

MsgBox StrArrayTemp(i)

next

@+

--
~Jean-Marc~ MSAE & MVP Windows XP Fr
M'écrire : http://msmvps.com/docxp/contact.aspx
- http://docxp.mvps.org - http://msmvps.com/docxp/ -
Aide en DIRECT sur Internet : http://communautes-ms.akro-net.org/



Bonjour,
Pour un tel fichier, l'utilisation d'une connexion type base de données
pourrait te simplifier la tâche.
exemple :
8<------------------------
Set oConnection=createObject( _
"ADODB.Connection")
oConnection.Open _
"Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
"Dbq=c:;" & _
"Extensions=asc,csv,tab,txt"

Set oRecordSet = oConnection.Execute( _
"SELECT * FROM source.csv " & _
"WHERE srv='nom_serveur1'")

While Not oRecordSet.EOF
MsgBox oRecordSet("srv")
oRecordSet.MoveNext
Wend
oConnection.Close
8<---------------------------

J'ai simplement ajouté une ligne d'en-tête au dessus des trois lignes que tu
donnes en exemple.
Le fichier texte ainsi obtenu est enregistré à la racine du lecteur c: sous
le nom 'source.csv'.
'srv' correspond au nom de la première colonne.
On peut faire les choses un peu plus rigoureusement en utilisant les objets
de type 'parameter' mais je pense que cela suffira ainsi dans ton cas.

Fais attention au cas où les lignes de l'exemple seraient coupées. Je les ai
raccourci mais sait-on jamais.

--
Fred








Avatar
Fred
Dans son message
moratella nous dit :

Fred, Jean-Marc,
Je vous remercie de l'intérêt que vous portez à mon problème.

Jean-marc as tu reçu mon mail avec les sources du script et le
fichier txt ? je suis passé par l'adresse
http://msmvps.com/docxp/contact.aspx

Fred, merci pour ta nouvelle orientation.
Si j'ai bien compris srv est l'entête de ma première colonne, mais
comment j'accede à la suite de l'enregistrement (les trois autres
colonnes).
en faite je ne désire pas les afficher mais les rentrer dans 3
variables distinctes afin d'effectuer une opération derrière
(installation d'une imprimante en locale via un outil)
(respectivement type_imprimante, nom_imprimante et adresse_ip)

En tout cas merci pour tout à vous deux
Raphaël



Dans le message:,
Bonjour et merci pour ces informations.
Suite à vos indications, je ne sais pas si cette fonction est la
plus adaptée à mes besoins.
Peut être auriez vous une autre piste pour aborder mon problème:
je dispose d'un fichier à 4 colonnes
(nom_serveur1;type_imprimanteA;nom_imprimanteXXX;adresse_ip
nom_serveur2;type_imprimanteB;nom_imprimanteYYY;adresse_ip
nom_serveur1;type_imprimanteB;nom_imprimanteZZZ;adresse_ip...)

en fonction du nom_serveur que je connais je dois récupérer dans des
variables les 3 autres champs sachant qu'il peut il y avoir plusieur
fois présent le nom_serveur.
Donc je dois parcourir l'ensemble du fichier et à chaque fois que je
croise le nom_serveur en entrée, je dois ranger les 3 autres champs
qui suivent dans des variables puis faire une opération et
recommencer jusqu'à la fin du fichier.
J'arrive à récuperer un champs mais pas trois.
En tout cas je vous remercie pour votre intervention
Raphaël

"~Jean-Marc~ [MVP]" wrote:

Salutations *~Jean-Marc~* !
Dans <news:
tu nous disais :
(par contre, je ne sais pas si on peut faire un split sur un
vbcrlf)


Correction : on peut !

Test = "Machine1" & vbcrlf & "Machine2" & vbcrlf & "Machine3"

StrArrayTemp = split(Test, vbcrlf)

for i = 0 to Ubound(StrArrayTemp)

MsgBox StrArrayTemp(i)

next

@+

--
~Jean-Marc~ MSAE & MVP Windows XP Fr
M'écrire : http://msmvps.com/docxp/contact.aspx
- http://docxp.mvps.org - http://msmvps.com/docxp/ -
Aide en DIRECT sur Internet : http://communautes-ms.akro-net.org/



Bonjour,
Pour un tel fichier, l'utilisation d'une connexion type base de
données pourrait te simplifier la tâche.
exemple :
8<------------------------
Set oConnection=createObject( _
"ADODB.Connection")
oConnection.Open _
"Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
"Dbq=c:;" & _
"Extensions=asc,csv,tab,txt"

Set oRecordSet = oConnection.Execute( _
"SELECT * FROM source.csv " & _
"WHERE srv='nom_serveur1'")

While Not oRecordSet.EOF
MsgBox oRecordSet("srv")
oRecordSet.MoveNext
Wend
oConnection.Close
8<---------------------------

J'ai simplement ajouté une ligne d'en-tête au dessus des trois
lignes que tu donnes en exemple.
Le fichier texte ainsi obtenu est enregistré à la racine du lecteur
c: sous le nom 'source.csv'.
'srv' correspond au nom de la première colonne.
On peut faire les choses un peu plus rigoureusement en utilisant les
objets de type 'parameter' mais je pense que cela suffira ainsi dans
ton cas.

Fais attention au cas où les lignes de l'exemple seraient coupées.
Je les ai raccourci mais sait-on jamais.

--
Fred



Oui, j'avais un peu trop raccourci la ligne !
En fait tu accèdes au contenu des différentes colonnes par leur nom.
J'avais écrit oRecordSet("srv") pour récupérer le contenu de la colonne srv.
Tu peux faire de même avec :

8<------
Type_Imp = oRecordSet("typeimp")
Nom_Imp = oRecordSet("nomimp")
Adr_Imp = oRecordSet("adrimp")
8<-------

Ici tu récupères les données dans trois variables comme tu le souhaitais.

Je suppose bien sûr que typeimp, nomimp et adrimp sont les en-têtes des
trois dernière colonnes.
Tu peux aussi supprimer la clause WHERE que j'avais mis pour l'exemple et
illustrer le fait qu'on a une grande souplesse pour l'extraction des
données.
La ligne deviendrait :

8<---------
Set oRecordSet = oConnection.Execute( _
"SELECT * FROM source.csv "
8<---------

--
Fred





Avatar
moratella
Merci Fred pour le complément d'info...
encore une dernière question... et oui..:-)
le select me permet bien de prendre la ligne qui contient le nom-serveur que
je connais et de récupérer par la suite les trois autres champs avec le
oRecordSet
donc si je veux effectuer cette opération à chaque fois que je rencontre une
ligne contenant le nom_serveur je dois faire :

While Not oRecordSet.EOF
Set oRecordSet = oConnection.Execute( _
"SELECT * FROM source.csv " & _
"WHERE srv='nom_serveur1'")
Type_Imp = oRecordSet("typeimp")
Nom_Imp = oRecordSet("nomimp")
Adr_Imp = oRecordSet("adrimp")
"mon module d'installation de l'imprimante"
oRecordSet.MoveNext
Wend

où alors

Set oRecordSet = oConnection.Execute( _
"SELECT * FROM source.csv " & _
"WHERE srv='nom_serveur1'")

While Not oRecordSet.EOF
Type_Imp = oRecordSet("typeimp")
Nom_Imp = oRecordSet("nomimp")
Adr_Imp = oRecordSet("adrimp")
oRecordSet.MoveNext
Wend


enfin dans cette partie:

Set oConnection=createObject( _
"ADODB.Connection")
oConnection.Open _
"Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
"Dbq=c:;" & _
"Extensions=asc,csv,tab,txt"



tu définie la connexion type base de données et je ne comprends pas trop les
associations d'extensions (asc,csv,tab,txt)
Cela transforme mon fichier .txt en .csv?

En tout cas merci de ta patience
Raphaël



Dans son message
moratella nous dit :

Fred, Jean-Marc,
Je vous remercie de l'intérêt que vous portez à mon problème.

Jean-marc as tu reçu mon mail avec les sources du script et le
fichier txt ? je suis passé par l'adresse
http://msmvps.com/docxp/contact.aspx

Fred, merci pour ta nouvelle orientation.
Si j'ai bien compris srv est l'entête de ma première colonne, mais
comment j'accede à la suite de l'enregistrement (les trois autres
colonnes).
en faite je ne désire pas les afficher mais les rentrer dans 3
variables distinctes afin d'effectuer une opération derrière
(installation d'une imprimante en locale via un outil)
(respectivement type_imprimante, nom_imprimante et adresse_ip)

En tout cas merci pour tout à vous deux
Raphaël



Dans le message:,
Bonjour et merci pour ces informations.
Suite à vos indications, je ne sais pas si cette fonction est la
plus adaptée à mes besoins.
Peut être auriez vous une autre piste pour aborder mon problème:
je dispose d'un fichier à 4 colonnes
(nom_serveur1;type_imprimanteA;nom_imprimanteXXX;adresse_ip
nom_serveur2;type_imprimanteB;nom_imprimanteYYY;adresse_ip
nom_serveur1;type_imprimanteB;nom_imprimanteZZZ;adresse_ip...)

en fonction du nom_serveur que je connais je dois récupérer dans des
variables les 3 autres champs sachant qu'il peut il y avoir plusieur
fois présent le nom_serveur.
Donc je dois parcourir l'ensemble du fichier et à chaque fois que je
croise le nom_serveur en entrée, je dois ranger les 3 autres champs
qui suivent dans des variables puis faire une opération et
recommencer jusqu'à la fin du fichier.
J'arrive à récuperer un champs mais pas trois.
En tout cas je vous remercie pour votre intervention
Raphaël

"~Jean-Marc~ [MVP]" wrote:

Salutations *~Jean-Marc~* !
Dans <news:
tu nous disais :
(par contre, je ne sais pas si on peut faire un split sur un
vbcrlf)


Correction : on peut !

Test = "Machine1" & vbcrlf & "Machine2" & vbcrlf & "Machine3"

StrArrayTemp = split(Test, vbcrlf)

for i = 0 to Ubound(StrArrayTemp)

MsgBox StrArrayTemp(i)

next

@+

--
~Jean-Marc~ MSAE & MVP Windows XP Fr
M'écrire : http://msmvps.com/docxp/contact.aspx
- http://docxp.mvps.org - http://msmvps.com/docxp/ -
Aide en DIRECT sur Internet : http://communautes-ms.akro-net.org/



Bonjour,
Pour un tel fichier, l'utilisation d'une connexion type base de
données pourrait te simplifier la tâche.
exemple :
8<------------------------
Set oConnection=createObject( _
"ADODB.Connection")
oConnection.Open _
"Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
"Dbq=c:;" & _
"Extensions=asc,csv,tab,txt"

Set oRecordSet = oConnection.Execute( _
"SELECT * FROM source.csv " & _
"WHERE srv='nom_serveur1'")

While Not oRecordSet.EOF
MsgBox oRecordSet("srv")
oRecordSet.MoveNext
Wend
oConnection.Close
8<---------------------------

J'ai simplement ajouté une ligne d'en-tête au dessus des trois
lignes que tu donnes en exemple.
Le fichier texte ainsi obtenu est enregistré à la racine du lecteur
c: sous le nom 'source.csv'.
'srv' correspond au nom de la première colonne.
On peut faire les choses un peu plus rigoureusement en utilisant les
objets de type 'parameter' mais je pense que cela suffira ainsi dans
ton cas.

Fais attention au cas où les lignes de l'exemple seraient coupées.
Je les ai raccourci mais sait-on jamais.

--
Fred



Oui, j'avais un peu trop raccourci la ligne !
En fait tu accèdes au contenu des différentes colonnes par leur nom.
J'avais écrit oRecordSet("srv") pour récupérer le contenu de la colonne srv.
Tu peux faire de même avec :

8<------
Type_Imp = oRecordSet("typeimp")
Nom_Imp = oRecordSet("nomimp")
Adr_Imp = oRecordSet("adrimp")
8<-------

Ici tu récupères les données dans trois variables comme tu le souhaitais.

Je suppose bien sûr que typeimp, nomimp et adrimp sont les en-têtes des
trois dernière colonnes.
Tu peux aussi supprimer la clause WHERE que j'avais mis pour l'exemple et
illustrer le fait qu'on a une grande souplesse pour l'extraction des
données.
La ligne deviendrait :

8<---------
Set oRecordSet = oConnection.Execute( _
"SELECT * FROM source.csv "
8<---------

--
Fred











Avatar
~Jean-Marc~ [MVP]
Salutations *moratella* !
Dans <news:
tu nous disais :
Jean-marc as tu reçu mon mail avec les sources du script et le
fichier txt ?


Bien reçu !

Si j'ai bien compris ce que tu veux, ça devrait convenir :

Option explicit

Const ForReading = 1
Dim fso, Fichier, strTmp, Compt, ArrTmp, i
'On suppose qu'il n'y aura pas plus de 10 imprimantes pour le serveur
'Mais on peut monter à 50 ou 100 par sécurité ;-)
Dim nom_serveur(10), type_imprimante(10), nom_imprimante(10), adresse_ip(10)
Set fso = WScript.CreateObject("Scripting.FileSystemObject")

Const FilePath = "C:Imprimantes.txt"
Const Serveur = "S0I354" 'toujours en majuscules

if fso.fileExists(FilePath) then
Compt = 0
Set Fichier = fso.OpenTextFile(FilePath, ForReading, False)
Do While Fichier.AtEndOfStream <> True
strTmp = Fichier.ReadLine
ArrTmp = split(strTmp, ";")
' Si il y a 4 valeurs sur la ligne et si la première
' valeur correspond au nom du serveur
if (Ubound(ArrTmp) = 3) and (Ucase(ArrTmp(0)) = Serveur) then
nom_serveur(Compt) = ArrTmp(0)
type_imprimante(Compt) = ArrTmp(1)
nom_imprimante(Compt) = ArrTmp(2)
adresse_ip(Compt) = ArrTmp(3)
Compt = Compt + 1
end if
Loop
Fichier.Close
else
MsgBox "Fichier de configuration : " & FilePath & " non trouvé."
WScript.quit
End if

for i = 0 to Compt - 1
' traitement imprimante par imprimante
' MsgBox pour test
MsgBox nom_serveur(i) & " / " & _
type_imprimante(i) & " / " & _
nom_imprimante(i) & " / " & _
adresse_ip(i), 32
next

@+

--
~Jean-Marc~ MSAE & MVP Windows XP Fr
M'écrire : http://msmvps.com/docxp/contact.aspx
- http://docxp.mvps.org - http://msmvps.com/docxp/ -
Aide en DIRECT sur Internet : http://communautes-ms.akro-net.org/

Avatar
Fred
Dans son message
moratella nous dit :

Merci Fred pour le complément d'info...
encore une dernière question... et oui..:-)
le select me permet bien de prendre la ligne qui contient le
nom-serveur que je connais et de récupérer par la suite les trois
autres champs avec le oRecordSet
donc si je veux effectuer cette opération à chaque fois que je
rencontre une ligne contenant le nom_serveur je dois faire :

While Not oRecordSet.EOF
Set oRecordSet = oConnection.Execute( _
"SELECT * FROM source.csv " & _
"WHERE srv='nom_serveur1'")
Type_Imp = oRecordSet("typeimp")
Nom_Imp = oRecordSet("nomimp")
Adr_Imp = oRecordSet("adrimp")
"mon module d'installation de l'imprimante"
oRecordSet.MoveNext
Wend

où alors

Set oRecordSet = oConnection.Execute( _
"SELECT * FROM source.csv " & _
"WHERE srv='nom_serveur1'")

While Not oRecordSet.EOF
Type_Imp = oRecordSet("typeimp")
Nom_Imp = oRecordSet("nomimp")
Adr_Imp = oRecordSet("adrimp")
oRecordSet.MoveNext
Wend


enfin dans cette partie:

Set oConnection=createObject( _
"ADODB.Connection")
oConnection.Open _
"Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
"Dbq=c:;" & _
"Extensions=asc,csv,tab,txt"



tu définie la connexion type base de données et je ne comprends pas
trop les associations d'extensions (asc,csv,tab,txt)
Cela transforme mon fichier .txt en .csv?

En tout cas merci de ta patience
Raphaël



Dans son message
moratella nous dit :

Fred, Jean-Marc,
Je vous remercie de l'intérêt que vous portez à mon problème.

Jean-marc as tu reçu mon mail avec les sources du script et le
fichier txt ? je suis passé par l'adresse
http://msmvps.com/docxp/contact.aspx

Fred, merci pour ta nouvelle orientation.
Si j'ai bien compris srv est l'entête de ma première colonne, mais
comment j'accede à la suite de l'enregistrement (les trois autres
colonnes).
en faite je ne désire pas les afficher mais les rentrer dans 3
variables distinctes afin d'effectuer une opération derrière
(installation d'une imprimante en locale via un outil)
(respectivement type_imprimante, nom_imprimante et adresse_ip)

En tout cas merci pour tout à vous deux
Raphaël



Dans le message:,
Bonjour et merci pour ces informations.
Suite à vos indications, je ne sais pas si cette fonction est la
plus adaptée à mes besoins.
Peut être auriez vous une autre piste pour aborder mon problème:
je dispose d'un fichier à 4 colonnes
(nom_serveur1;type_imprimanteA;nom_imprimanteXXX;adresse_ip
nom_serveur2;type_imprimanteB;nom_imprimanteYYY;adresse_ip
nom_serveur1;type_imprimanteB;nom_imprimanteZZZ;adresse_ip...)

en fonction du nom_serveur que je connais je dois récupérer dans
des variables les 3 autres champs sachant qu'il peut il y avoir
plusieur fois présent le nom_serveur.
Donc je dois parcourir l'ensemble du fichier et à chaque fois que
je croise le nom_serveur en entrée, je dois ranger les 3 autres
champs qui suivent dans des variables puis faire une opération et
recommencer jusqu'à la fin du fichier.
J'arrive à récuperer un champs mais pas trois.
En tout cas je vous remercie pour votre intervention
Raphaël

"~Jean-Marc~ [MVP]" wrote:

Salutations *~Jean-Marc~* !
Dans <news:
tu nous disais :
(par contre, je ne sais pas si on peut faire un split sur un
vbcrlf)


Correction : on peut !

Test = "Machine1" & vbcrlf & "Machine2" & vbcrlf & "Machine3"

StrArrayTemp = split(Test, vbcrlf)

for i = 0 to Ubound(StrArrayTemp)

MsgBox StrArrayTemp(i)

next

@+

--
~Jean-Marc~ MSAE & MVP Windows XP Fr
M'écrire : http://msmvps.com/docxp/contact.aspx
- http://docxp.mvps.org - http://msmvps.com/docxp/ -
Aide en DIRECT sur Internet :
http://communautes-ms.akro-net.org/



Bonjour,
Pour un tel fichier, l'utilisation d'une connexion type base de
données pourrait te simplifier la tâche.
exemple :
8<------------------------
Set oConnection=createObject( _
"ADODB.Connection")
oConnection.Open _
"Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
"Dbq=c:;" & _
"Extensions=asc,csv,tab,txt"

Set oRecordSet = oConnection.Execute( _
"SELECT * FROM source.csv " & _
"WHERE srv='nom_serveur1'")

While Not oRecordSet.EOF
MsgBox oRecordSet("srv")
oRecordSet.MoveNext
Wend
oConnection.Close
8<---------------------------

J'ai simplement ajouté une ligne d'en-tête au dessus des trois
lignes que tu donnes en exemple.
Le fichier texte ainsi obtenu est enregistré à la racine du lecteur
c: sous le nom 'source.csv'.
'srv' correspond au nom de la première colonne.
On peut faire les choses un peu plus rigoureusement en utilisant
les objets de type 'parameter' mais je pense que cela suffira
ainsi dans ton cas.

Fais attention au cas où les lignes de l'exemple seraient coupées.
Je les ai raccourci mais sait-on jamais.

--
Fred



Oui, j'avais un peu trop raccourci la ligne !
En fait tu accèdes au contenu des différentes colonnes par leur nom.
J'avais écrit oRecordSet("srv") pour récupérer le contenu de la
colonne srv. Tu peux faire de même avec :

8<------
Type_Imp = oRecordSet("typeimp")
Nom_Imp = oRecordSet("nomimp")
Adr_Imp = oRecordSet("adrimp")
8<-------

Ici tu récupères les données dans trois variables comme tu le
souhaitais.

Je suppose bien sûr que typeimp, nomimp et adrimp sont les en-têtes
des trois dernière colonnes.
Tu peux aussi supprimer la clause WHERE que j'avais mis pour
l'exemple et illustrer le fait qu'on a une grande souplesse pour
l'extraction des données.
La ligne deviendrait :

8<---------
Set oRecordSet = oConnection.Execute( _
"SELECT * FROM source.csv "
8<---------

--
Fred



Je ne savais pas trop si tu souhaitais récupérer *uniquement* les
informations pour un serveur donné, ou bien si tu voulais passer en revue
tous les serveurs. Il me semble que c'est la seconde option ?
Là je dirais que ce n'est plus un problème "base de données" mais plus
d'algorithmique.
Deux solution dont une que je préfère :

1) Deux boucles imbriquées (et donc deux recordsets), une pour extraire les
noms des serveurs, l'autre pour faire tous les traitement liés à un serveur.
Je n'aime pas trop, donc passons ;-)
2) Une boucle qui teste, à chaque tour, si le nom du serveur est le même que
lors du tour précédent. Donc quelque chose comme cela.

8<------------------------
Dim ServeurPrec
Dim ServeurCour

Set oConnection=createObject( _
"ADODB.Connection")
oConnection.Open _
"Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
"Dbq=c:;" & _
"Extensions=asc,csv,tab,txt"

Set oRecordSet = oConnection.Execute( _
"SELECT * FROM source.csv ")

ServeurPrec = ""
While Not oRecordSet.EOF
ServeurCour = oRecordSet("srv")
Type_Imp = oRecordSet("typeimp")
Nom_Imp = oRecordSet("nomimp")
Adr_Imp = oRecordSet("adrimp")

If ServeurCour <> ServeurPrec Then
'Faire ici les initialisations liées au traitement
'd'un nouveau serveur (si nécessaire).

'Grace à la ligne qui suit, on saura, au prochain
'tour de boucle si on traite toujours le même
'serveur (ou si on change encore).
ServeurPrec = ServeurCour
End If

'Faire ici le traitement lié à l'imprimante

oRecordSet.MoveNext
Wend
oConnection.Close
8<---------------------------

J'ai supposé dans tout cela que tout ton fichier était conforme aux trois
lignes que tu as mises en exemple. Cela me faisait penser à un export au
format csv que l'on peut faire avec certains outils d'administration. Donc
j'ai pris un fichier csv pour mon exemple ;-)
Tout ceci suppose également que tu as une ligne d'en-tête mais je crois
qu'on peut aussi faire sans (je n'ai plus cela en mémoire).
Au pire, tu peux l'ajouter en vbs, ou même en batch (pour le prochain
épisode si tu décides d'utiliser cette méthode !)
Entre temps, j'ai vu que Jean-Marc t'a proposé un algo qui teste s'il y a
bien 4 colonnes. Si ce n'est pas toujours le cas, ma méthode n'est pas
utilisable.

Enfin, concernant ce que l'on appelle la 'chaîne de connexion', cela ne
s'invente pas, et quand j'en ai besoin, je vais sur ce site :
http://www.carlprothman.net/Default.aspx?tabid
et pour ce cas précis :
http://www.carlprothman.net/Default.aspx?tabid#ODBCDriverForText

Les extensions que tu vois sont simplement celles qui sont acceptées. Donc
avec un fichier txt, cela devrait fonctionner exactement de la même manière
sauf que la syntaxe du Select sera :

"SELECT * FROM source.TXT" (txt à la place de csv)

D'autre part, derrière le paramètre Dbq= tu dois spécifier le chemin du
répertoire qui contient ton fichier.
Pour le reste, il faut scrupuleusement respecter la syntaxe.
Voila, je crois avoir fait le tour.
Si tu veux aller plus loin, je retrouverai les autres informations
concernant la présence ou non des en-têtes, les modes d'ouverture et le
changement du séparateur par défaut (; en l'occurence)

Bon courage et bonne soirée !

--
Fred







1 2