Lecture et écriture (remplacement d'un mot par une variable) dans un fichier

Le
Obiwan
Bonjour;

Dans le cadre d'un projet de gestion d'un routeur, je développe une
application en VB6.

L'objectif est de charger une configuration générique contenant des
variables appelés "trous". Ces trous doivent être comblés par des valeurs
déterminées lors de l'établissement d'un scénario de configuration et,
l'ensemble des trous comblés sauvegardés dans un nouveau fichier qui sera
chargé dans le routeur par la suite.

Les trous sont en réalités des balises du style $$VariableAIsérer$$ (balise
placée dans un endroit précis dans le fichier de base et doivcent être
remplacées par des variables du style "MaVariableAInsérer" (valeur textbox)
en vis-à-vis de sa balise.

Exemple, la balise $$HostName$$ doit être remplacée par la valeur HostName
déterminée dans un textbox.

Donc, mon raisonnement est le suivant:

1. Ouverture en lecture du fichier à trou
2. Lecture du fichier en mode séquentiel pour déterminer les "trous" avec
insertion immédiate de la valeur dans les trous
3. Ouvrir en écriture un nouveau fichier et copier le contenu du 1er fichier
avec les trous comblés
4. Sauvegarder le nouveau fichier sous un autre nom.

Pour l'ouverture en lecture et chargement dans un buffer => pas de problème.
Par contre, pour l'ouverture en écriture, remplacement des mots par des
nouveaux mots et sauvegardés sous un nouveau => je bloque.
Je n'arrive pas à établir un alogo correcte. Je sais que l'on peut à la fois
ouvrir, lire, remplacer les mots et écrire dans un nouveau fichier aisement
mais, je n'y arrive pas.

Si qlq pouvait ou avait déjà fait un algo similaire, je lui en serai
reconnaissant. Du moins, je me diriger vers une piste exploitable, le reste,
j'arriverai certainement à le mettre en oeuvre.

Je remercie d'avance la communauté.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
AT
Le #19709711
Obiwan a formulé ce lundi :
Bonjour;

Dans le cadre d'un projet de gestion d'un routeur, je développe une
application en VB6.

L'objectif est de charger une configuration générique contenant des variables
appelés "trous". Ces trous doivent être comblés par des valeurs déterminées
lors de l'établissement d'un scénario de configuration et, l'ensemble des
trous comblés sauvegardés dans un nouveau fichier qui sera chargé dans le
routeur par la suite.

Les trous sont en réalités des balises du style $$VariableAIsérer$$ (balise
placée dans un endroit précis dans le fichier de base et doivcent être
remplacées par des variables du style "MaVariableAInsérer" (valeur textbox)
en vis-à-vis de sa balise.

Exemple, la balise $$HostName$$ doit être remplacée par la valeur HostName
déterminée dans un textbox.

Donc, mon raisonnement est le suivant:

1. Ouverture en lecture du fichier à trou
2. Lecture du fichier en mode séquentiel pour déterminer les "trous" avec
insertion immédiate de la valeur dans les trous
3. Ouvrir en écriture un nouveau fichier et copier le contenu du 1er fichier
avec les trous comblés
4. Sauvegarder le nouveau fichier sous un autre nom.

Pour l'ouverture en lecture et chargement dans un buffer => pas de problème.
Par contre, pour l'ouverture en écriture, remplacement des mots par des
nouveaux mots et sauvegardés sous un nouveau => je bloque.
Je n'arrive pas à établir un alogo correcte. Je sais que l'on peut à la fois
ouvrir, lire, remplacer les mots et écrire dans un nouveau fichier aisement
mais, je n'y arrive pas.

Si qlq pouvait ou avait déjà fait un algo similaire, je lui en serai
reconnaissant. Du moins, je me diriger vers une piste exploitable, le reste,
j'arriverai certainement à le mettre en oeuvre.

Je remercie d'avance la communauté.




Déjà tu as à disposition le fameux "replace" qui permet de trouver et
remplacer une expression dans une chaîne. Si chaque balise dans ton
fichier est unique, ça facilite le travail.

Par exemple,

chaine = "tototititatatutu"
chaine = Replace(chaine, "tutu", "blabla")
MsgBox chaine

Donc tutu est remplacé par blabla dans la chaîne. A toi de mettre le
contenu de ton fichier dans la variable chaine et d'utiliser replace
suivant la nécessité.

Pour l'écriture, c'est

write #1, chaine

ou alors

print #1,chaine



Je copier colle la doc de write:


Écrit des données dans un fichier séquentiel.

Syntaxe

Write #filenumber, [outputlist]

La syntaxe de l'instruction Write # comprend les éléments suivants :

Élément Description
filenumber Toutnuméro de fichier valide.
outputlist Facultatif. Une ou plusieursexpressions numériques
ouexpressions de chaîne délimitées par des séparateurs virgules, devant
être écrites dans un fichier.


Remarques

Les données écrites à l'aide de l'instruction Write # sont généralement
lues dans un fichier avec l'instruction Input #.

Si vous omettez l'argument outputlist et si vous insérez un séparateur
virgule après l'argument filenumber, une ligne vierge est imprimée dans
le fichier. Vous pouvez séparer plusieurs expressions par un espace, un
point-virgule ou une virgule. Un espace ou un point-virgule ont le même
effet.

Lorsque l'instruction Write # est utilisée pour écrire des données dans
un fichier, certaines conventions universelles sont respectées afin que
les données puissent être lues et correctement interprétées à l'aide de
l'instruction Input #, quels que soient lesparamètres régionaux :

Les données numériques sont toujours écrites avec un point en tant que
séparateur décimal.


Pour les données de typeBoolean, la valeur #TRUE# ou #FALSE# est
imprimée. Lesmots clés True et False ne sont jamais traduits, quels que
soient les paramètres régionaux.


Les données de typeDate sont écrites dans le fichier conformément
auformat de date universel. Si la composante date ou heure est omise ou
égale à zéro, seule la partie fournie est écrite dans le fichier.


Si les données de l'argument outputlist sont de typeEmpty, rien n'est
écrit dans le fichier. Toutefois, dans le cas de données de typeNull,
la valeur #NULL# est écrite.


Si les données de l'argument outputlist sont de type Null, la valeur
#NULL# est écrite dans le fichier.


Pour les données de type Error, le résultat apparaît sous la forme
#ERROR errorcode#. Le mot clé Error n'est jamais traduit, quels que
soient les paramètres régionaux.
Contrairement à l'instruction Print #, l'instruction Write # insère des
virgules entre les éléments et des guillemets doubles de part et
d'autre des chaînes de caractères au moment de leur écriture dans le
fichier. Vous n'avez donc pas à placer de séparateurs explicites dans
la liste. L'instruction Write # insère un caractère de passage à la
ligne, c'est-à-dire un retour chariot–saut de ligne (Chr(13) +
Chr(10)), après l'écriture dans le fichier du dernier caractère contenu
dans l'argument outputlist.
Jean-marc
Le #19710461
Obiwan wrote:
Bonjour;



Hello,

Je pense que cet article devrait t'éclairer:
http://faq.vb.free.fr/index.php?question4

Tu trouveras dans la FAQ de trèn nombreux articles traitant
de la manipulation de fichiers:
http://faq.vb.free.fr/index.php?rubrique

et la manipulation de chaines de caractères:
http://faq.vb.free.fr/index.php?rubrique8
http://faq.vb.free.fr/index.php?question7

Maintenant, il y a quand même plus simple pour réaliser
ce que tu veux.

Voici un exemple très général du genre de choses qu'on peut
faire. C'est un exemple codé à la va-vite pour illustrer
le principe de base. Il faut évidemment ajouter du controle
d'erreur, faire des fonctions génériques, sauvegarder le
fichier "modèle", etc. Mais c'est l"idée générale, à
adapter à tes besoins propres.

Private Sub Command1_Click()
Dim f As Integer
Dim s As String
Dim p As Long
Dim VarName As String
Dim ParamNames(100) As String
Dim ParamValues(100) As String
Dim i As Long
Dim nbParam As Long

' lecture fichier config vide
f = FreeFile
Open "c:config.dat" For Input As #f
While Not EOF(f)
Line Input #f, s
p = InStr(s, "=")
If p <> 0 Then
VarName = Mid$(s, 1, p - 1)
nbParam = nbParam + 1
ParamNames(nbParam) = VarName
End If
Wend
Close #f

' saisie des valeurs
For i = 1 To nbParam
ParamValues(i) = InputBox("Valeur pour " & ParamNames(i) & " : ")
Next i

' sauvegarde dans fichier
f = FreeFile
Open "c:config.dat" For Output As #f
For i = 1 To nbParam
Print #f, ParamNames(i) & "=" & ParamValues(i)
Next i
Close #f
End Sub

Cordialement;


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Jean-marc
Le #19710451
Jean-marc wrote:
Obiwan wrote:
Bonjour;



Maintenant, il y a quand même plus simple pour réaliser
ce que tu veux.



J'oubliais de préciser:
pour tester la chose, il faut un fichier de config (config.dat)
de la forme:

HostName Port Machine ...

Voila :-)

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Obiwan
Le #19716701
Hello;

Merci pour les "coups de pouces".

Après avoir réfléchi au sujet, c'était hyper simple.

Voici le code que j'ai développer et ça fonctionne correctement. Je dois
encore gérer les erreurs et les exceptions et ce sera au point.

Private Sub Command1_Click()

Dim Tempo As String

'Ouverture du fichier "modèle" en lecture

Open "C:Program FilesCiscoRT_Gen.conf" For Input As #1

'Ouverture du fichier "cible" en écriture. La valeur contenue dans la
combobox fixera le nom du fichier cible!

Open "C:Program FilesCiscoConfOps" & Combo1.Text For Output As #2

'Boucle tant que la fin du fichier n'est pas atteinte

Do While Not EOF(1)

' Chargement du fichier en lecture séquentielle dans un buffer "Tempo"

Line Input #1, Tempo

' Remplacement des balises par les variables

Tempo = Replace(Tempo, "$$HostName$$", Combo1.Text)

Tempo = Replace(Tempo, "$$PwdEna$$", PwdEna.Text)

etc...

'Ecriture du buffer dans le fichier cible

Print #2, Tempo

' On recommence tant que la boucle n'est pas finie

Loop

'Fermeture du fichier modèle

Close #1

'Fermeture du fichier cible

Close #2

' Message qui sera affiché (quand j'aurai gérer les erreurs et exceptions)

MsgBox ("Création et sauvegarde du fichier de configuration réussie")

End Sub


Voilà, il me suffisait de réfléchir un peu et de consulter les informations
divulguées par les membres du forum
qui ont bien voulu m'orienter.

Merci à vous

Obiwan

------------------------------------------------------------------------
"Obiwan" h2sul8$db3$
Bonjour;

Dans le cadre d'un projet de gestion d'un routeur, je développe une
application en VB6.

L'objectif est de charger une configuration générique contenant des
variables appelés "trous". Ces trous doivent être comblés par des valeurs
déterminées lors de l'établissement d'un scénario de configuration et,
l'ensemble des trous comblés sauvegardés dans un nouveau fichier qui sera
chargé dans le routeur par la suite.

Les trous sont en réalités des balises du style $$VariableAIsérer$$
(balise placée dans un endroit précis dans le fichier de base et doivcent
être remplacées par des variables du style "MaVariableAInsérer" (valeur
textbox) en vis-à-vis de sa balise.

Exemple, la balise $$HostName$$ doit être remplacée par la valeur HostName
déterminée dans un textbox.

Donc, mon raisonnement est le suivant:

1. Ouverture en lecture du fichier à trou
2. Lecture du fichier en mode séquentiel pour déterminer les "trous" avec
insertion immédiate de la valeur dans les trous
3. Ouvrir en écriture un nouveau fichier et copier le contenu du 1er
fichier avec les trous comblés
4. Sauvegarder le nouveau fichier sous un autre nom.

Pour l'ouverture en lecture et chargement dans un buffer => pas de
problème.
Par contre, pour l'ouverture en écriture, remplacement des mots par des
nouveaux mots et sauvegardés sous un nouveau => je bloque.
Je n'arrive pas à établir un alogo correcte. Je sais que l'on peut à la
fois ouvrir, lire, remplacer les mots et écrire dans un nouveau fichier
aisement mais, je n'y arrive pas.

Si qlq pouvait ou avait déjà fait un algo similaire, je lui en serai
reconnaissant. Du moins, je me diriger vers une piste exploitable, le
reste, j'arriverai certainement à le mettre en oeuvre.

Je remercie d'avance la communauté.








AT
Le #19718031
Obiwan a couché sur son écran :
Hello;

Merci pour les "coups de pouces".

Après avoir réfléchi au sujet, c'était hyper simple.

Voici le code que j'ai développer et ça fonctionne correctement. Je dois
encore gérer les erreurs et les exceptions et ce sera au point.

Private Sub Command1_Click()

Dim Tempo As String

'Ouverture du fichier "modèle" en lecture

Open "C:Program FilesCiscoRT_Gen.conf" For Input As #1

'Ouverture du fichier "cible" en écriture. La valeur contenue dans la
combobox fixera le nom du fichier cible!

Open "C:Program FilesCiscoConfOps" & Combo1.Text For Output As #2

'Boucle tant que la fin du fichier n'est pas atteinte

Do While Not EOF(1)

' Chargement du fichier en lecture séquentielle dans un buffer "Tempo"

Line Input #1, Tempo

' Remplacement des balises par les variables

Tempo = Replace(Tempo, "$$HostName$$", Combo1.Text)

Tempo = Replace(Tempo, "$$PwdEna$$", PwdEna.Text)

etc...

'Ecriture du buffer dans le fichier cible

Print #2, Tempo

' On recommence tant que la boucle n'est pas finie

Loop

'Fermeture du fichier modèle

Close #1

'Fermeture du fichier cible

Close #2

' Message qui sera affiché (quand j'aurai gérer les erreurs et exceptions)

MsgBox ("Création et sauvegarde du fichier de configuration réussie")

End Sub


Voilà, il me suffisait de réfléchir un peu et de consulter les informations
divulguées par les membres du forum
qui ont bien voulu m'orienter.

Merci à vous

Obiwan





C'est bourrin mais ça doit marcher. Si tu veux affiner, laisse le
fichier se charger complètement avant de commencer à le traiter,
histoire de ne pas mélanger les procédures et pour la re-lecture du
programme dans quelques mois tu gagneras du temps en compréhension si
tu as bien séparé chaque fonction. Même en debogage au moment de
l'écriture c'est plus simple.
Publicité
Poster une réponse
Anonyme