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ëlDans 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ëlDans 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
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 6FC8CF67-B608-4407-B19E-93116F12261F@microsoft.com
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:428FB358-C84F-4696-B3DC-150410C3268F@microsoft.com,
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:uef9sA7XFHA.3464@TK2MSFTNGP10.phx.gbl>
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
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ëlDans 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ëlDans 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
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/
Salutations *moratella* !
Dans <news:6FC8CF67-B608-4407-B19E-93116F12261F@microsoft.com>
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/
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/
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ëlDans 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ëlDans 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
Bon, j'ai approfondi un peu les choses, cela ne fait pas de mal.
D'une part, j'ai apporté une correction très importante à la requête car je
n'avais pas tenu compte du fait que les lignes du fichier ne sont pas
ordonnées selon le nom des serveurs.
D'autre part, j'ai fait deux oublis dans le traitement (et à titre d'exemple
j'ai fait un traitement simple qui consiste à afficher la liste des
imprimantes de chaque serveur)
Enfin, j'ai réglé le problème de la ligne d'en-tête et testé avec un fichier
d'extension .txt
Il suffit de créer un fichier schema.ini dans le même répertoire que le
fichier source (que j'ai donc renommé en source.txt)
Ce fichier schema.ini doit contenir les lignes suivantes :
8<--------------------
[source.txt]
FormatÞlimited(;)
ColNameHeaderúlse
Col1=srv Text
Col2=typeimp Text
Col3=nomimp Text
Col4rimp Text
8<--------------------
Commentaires :
Entre crochets figure le nom du fichier à scanner.
FormatÞlimited(;) indique que les colonnes sont séparées par un ;
ColNameHeaderúlse indique que les données commencent dès la première ligne
(pas de ligne d'en-tête)
Et bien sûr puisqu'il n'y a pas de ligne d'en-tête, on nomme ensuite les
différentes colonnes en précisant le type de données.
Toutes les références précises ici :
http://msdn.microsoft.com/library/en-us/odbc/htm/odbcjetschema_ini_file.asp
Et voici le programme de test corrigé et annoté
8<----------------------
Dim ServeurPrec
Dim ServeurCour
Dim Msg
Set oConnection=createObject( _
"ADODB.Connection")
oConnection.Open _
"Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
"Dbq=c:;" & _
"Extensions=asc,csv,tab,txt"
'J'avais, ci-dessous, oublié le ORDER BY srv
Set oRecordSet = oConnection.Execute( _
"SELECT * FROM source.txt " & _
"ORDER BY srv")
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 un éventuel traitement final
'avant de passer à un autre serveur.
'A condition que ce ne soit pas le
'premier tour de boucle.
'Dans mon exemple, cela consiste
'à afficher le message (liste des imp.)
If ServeurPrec <> "" Then
MsgBox Msg
End If
'Faire ici les initialisations liées au traitement
'd'un nouveau serveur (si nécessaire).
'Dans mon exemple, cela consiste
'à réinitialiser le message avec le nom du
'nouveau serveur et un retour à la ligne.
Msg = ServeurCour & vbCrLf
'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
'Dans mon exemple cela consiste à ajouter
'au message les informations imprimante
'avec un retour à la ligne.
Msg = Msg & Type_Imp & " - " & Nom_Imp & " - " & Adr_Imp & vbCrLf
oRecordSet.MoveNext
Wend
'Faire ici le traitement final du dernier serveur
'Donc affichage du dernier message
MsgBox Msg
oConnection.Close
8<----------------------
PS : si le fichier est vide, cela affiche un message vide. Cela peut faire
l'objet d'un traitement particulier.
D'où vient ce fichier à propos ? Ce n'est pas d'une base de données par
hasard ? ;-)
--
Fred
Dans son message E580B0BC-F334-483C-B3F0-D17BDDE3FAA3@microsoft.com
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 6FC8CF67-B608-4407-B19E-93116F12261F@microsoft.com
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:428FB358-C84F-4696-B3DC-150410C3268F@microsoft.com,
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:uef9sA7XFHA.3464@TK2MSFTNGP10.phx.gbl>
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
Bon, j'ai approfondi un peu les choses, cela ne fait pas de mal.
D'une part, j'ai apporté une correction très importante à la requête car je
n'avais pas tenu compte du fait que les lignes du fichier ne sont pas
ordonnées selon le nom des serveurs.
D'autre part, j'ai fait deux oublis dans le traitement (et à titre d'exemple
j'ai fait un traitement simple qui consiste à afficher la liste des
imprimantes de chaque serveur)
Enfin, j'ai réglé le problème de la ligne d'en-tête et testé avec un fichier
d'extension .txt
Il suffit de créer un fichier schema.ini dans le même répertoire que le
fichier source (que j'ai donc renommé en source.txt)
Ce fichier schema.ini doit contenir les lignes suivantes :
8<--------------------
[source.txt]
FormatÞlimited(;)
ColNameHeaderúlse
Col1=srv Text
Col2=typeimp Text
Col3=nomimp Text
Col4rimp Text
8<--------------------
Commentaires :
Entre crochets figure le nom du fichier à scanner.
FormatÞlimited(;) indique que les colonnes sont séparées par un ;
ColNameHeaderúlse indique que les données commencent dès la première ligne
(pas de ligne d'en-tête)
Et bien sûr puisqu'il n'y a pas de ligne d'en-tête, on nomme ensuite les
différentes colonnes en précisant le type de données.
Toutes les références précises ici :
http://msdn.microsoft.com/library/en-us/odbc/htm/odbcjetschema_ini_file.asp
Et voici le programme de test corrigé et annoté
8<----------------------
Dim ServeurPrec
Dim ServeurCour
Dim Msg
Set oConnection=createObject( _
"ADODB.Connection")
oConnection.Open _
"Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
"Dbq=c:;" & _
"Extensions=asc,csv,tab,txt"
'J'avais, ci-dessous, oublié le ORDER BY srv
Set oRecordSet = oConnection.Execute( _
"SELECT * FROM source.txt " & _
"ORDER BY srv")
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 un éventuel traitement final
'avant de passer à un autre serveur.
'A condition que ce ne soit pas le
'premier tour de boucle.
'Dans mon exemple, cela consiste
'à afficher le message (liste des imp.)
If ServeurPrec <> "" Then
MsgBox Msg
End If
'Faire ici les initialisations liées au traitement
'd'un nouveau serveur (si nécessaire).
'Dans mon exemple, cela consiste
'à réinitialiser le message avec le nom du
'nouveau serveur et un retour à la ligne.
Msg = ServeurCour & vbCrLf
'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
'Dans mon exemple cela consiste à ajouter
'au message les informations imprimante
'avec un retour à la ligne.
Msg = Msg & Type_Imp & " - " & Nom_Imp & " - " & Adr_Imp & vbCrLf
oRecordSet.MoveNext
Wend
'Faire ici le traitement final du dernier serveur
'Donc affichage du dernier message
MsgBox Msg
oConnection.Close
8<----------------------
PS : si le fichier est vide, cela affiche un message vide. Cela peut faire
l'objet d'un traitement particulier.
D'où vient ce fichier à propos ? Ce n'est pas d'une base de données par
hasard ? ;-)
--
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ëlDans 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ëlDans 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
Bon, j'ai approfondi un peu les choses, cela ne fait pas de mal.
D'une part, j'ai apporté une correction très importante à la requête car je
n'avais pas tenu compte du fait que les lignes du fichier ne sont pas
ordonnées selon le nom des serveurs.
D'autre part, j'ai fait deux oublis dans le traitement (et à titre d'exemple
j'ai fait un traitement simple qui consiste à afficher la liste des
imprimantes de chaque serveur)
Enfin, j'ai réglé le problème de la ligne d'en-tête et testé avec un fichier
d'extension .txt
Il suffit de créer un fichier schema.ini dans le même répertoire que le
fichier source (que j'ai donc renommé en source.txt)
Ce fichier schema.ini doit contenir les lignes suivantes :
8<--------------------
[source.txt]
FormatÞlimited(;)
ColNameHeaderúlse
Col1=srv Text
Col2=typeimp Text
Col3=nomimp Text
Col4rimp Text
8<--------------------
Commentaires :
Entre crochets figure le nom du fichier à scanner.
FormatÞlimited(;) indique que les colonnes sont séparées par un ;
ColNameHeaderúlse indique que les données commencent dès la première ligne
(pas de ligne d'en-tête)
Et bien sûr puisqu'il n'y a pas de ligne d'en-tête, on nomme ensuite les
différentes colonnes en précisant le type de données.
Toutes les références précises ici :
http://msdn.microsoft.com/library/en-us/odbc/htm/odbcjetschema_ini_file.asp
Et voici le programme de test corrigé et annoté
8<----------------------
Dim ServeurPrec
Dim ServeurCour
Dim Msg
Set oConnection=createObject( _
"ADODB.Connection")
oConnection.Open _
"Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
"Dbq=c:;" & _
"Extensions=asc,csv,tab,txt"
'J'avais, ci-dessous, oublié le ORDER BY srv
Set oRecordSet = oConnection.Execute( _
"SELECT * FROM source.txt " & _
"ORDER BY srv")
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 un éventuel traitement final
'avant de passer à un autre serveur.
'A condition que ce ne soit pas le
'premier tour de boucle.
'Dans mon exemple, cela consiste
'à afficher le message (liste des imp.)
If ServeurPrec <> "" Then
MsgBox Msg
End If
'Faire ici les initialisations liées au traitement
'd'un nouveau serveur (si nécessaire).
'Dans mon exemple, cela consiste
'à réinitialiser le message avec le nom du
'nouveau serveur et un retour à la ligne.
Msg = ServeurCour & vbCrLf
'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
'Dans mon exemple cela consiste à ajouter
'au message les informations imprimante
'avec un retour à la ligne.
Msg = Msg & Type_Imp & " - " & Nom_Imp & " - " & Adr_Imp & vbCrLf
oRecordSet.MoveNext
Wend
'Faire ici le traitement final du dernier serveur
'Donc affichage du dernier message
MsgBox Msg
oConnection.Close
8<----------------------
PS : si le fichier est vide, cela affiche un message vide. Cela peut faire
l'objet d'un traitement particulier.
D'où vient ce fichier à propos ? Ce n'est pas d'une base de données par
hasard ? ;-)
--
Fred