Mettre à jour une zone dans un fichier texte [Résolu]

Signaler
Messages postés
13
Date d'inscription
samedi 25 novembre 2006
Statut
Membre
Dernière intervention
5 juin 2010
-
Messages postés
13
Date d'inscription
samedi 25 novembre 2006
Statut
Membre
Dernière intervention
5 juin 2010
-
bonjour
j'utilise un fichier texte comme source de données pour fusinner un document Word
le fichier texte à un enregistrement d'entête et des lignes de données comme suit :
Nom      Prenom      Date naissance N° facture  Montant_en_chiffre     Montant_en_lettre
Toto      Rémi          12/04/1985      12345                 200                          ???        
Zoro      Martin        04/02/1975      65831               300                           ???
---         ---               ----                  ---                     ---                           ???

je voudrais faire une lecture séquensiel,
récupérer la position du Montant_en_Chiffre ici colonne 5, données 200 et mettre à jour Montant_en _lettre ici colonne 6, données = deux cent
et ainsi de suite

A noter que les deux colonnes concernées sont dans le cas réél en colonne 60 et 80 à partir le la colonne 1 (Nom)
 
Comment écrire cela sous vb6?

8 réponses

Messages postés
13
Date d'inscription
samedi 25 novembre 2006
Statut
Membre
Dernière intervention
5 juin 2010

merci bcp le problème est régle, t'es un crack
finalement je lis le fichier Montant.txt et j'écris dans un autre fichier Montant1.txt

dans montant.txt j'avais
VS01  VS02  VS03
4           E       1235,12
15         D      2580,56

je retrouve dans montant1.txt
VS01   VS02                                                   VS03
4           E                           mille deux cents trente cinq  Euros et douze  Centimes
15         D                          deux mille  cinq cents quatre-vingt   Euros et cinquante six  Centimes

comme suit :

Sub Conversion()
 
Dim textline
Dim Zone As String
Dim sValueLettre As String


Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8


Dim oFSO
    Set oFSO = CreateObject("Scripting.FileSystemObject")
Dim oTxtFile
    Set oTxtFile = oFSO.OpenTextFile("C:\temp\Montant1.txt", ForWriting, True)
   
FF = FreeFile




   Open "C:\temp\Montant.txt" For Input As #FF
   
    Do While Not EOF(FF)
             Line Input #FF, textline
            
            tabul = Split(textline, vbTab)
          
       MyPos = InStr(1, tabul(2), "VS")
       
       
       If MyPos <> 1 Then
        txt_Nb_Text = tabul(2)

 ' traitement chiffres en lettres
       Call ChiffresLettres_F((CDbl(txt_Nb_Text)), sValueLettre)
       
      tabul(2) = sValueLettre
      End If
     
        Zone = tabul(0) & vbTab & tabul(1) & vbTab & tabul(2)
        oTxtFile.WriteLine Zone
 Loop


Close #FF


  
End Sub
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut
On suppose que chaque donnée est séparée par des tabulations (ou largeur des données fixe) ?
De toute façon, c'est la même technique que pour lire des fichiers CSV.
Cherche donc CSV parmi les codes du site.

Si les largeurs des données sont fixes, tu peux lire et écrire en mode sequentiel :
- Crée un type propre à la structure de ta ligne :
Private Type monTypeDeLigne
   Dim Nom As String * 10
   Dim Prénom As String * 10
   ...
   Dim Montant_en_chiffre As String * 10
   ...
   Dim CaractèreDeFinDeLigne As String * 2   ' = le vbCrLf à la fin de la ligne
End Type
Dim maLigne As monTypeDeLigne
- Ensuite, regarde du côté de l'instruction Open en mode d'accès séquentiel :
ff = FreeFile
Open "monFichier.txt" For Random Access Read Write As #ff Len = Len(maLigne)
   Do While Not EOF(ff)
      Get #ff, NoLigne, maLigne
      ' ton traitement ici pour modifier maLigne.Montant_en_chiffre
      Put #ff, NoLigne, maLigne
   Loop
Close #ff
L'avantage des fichiers séquentiels, c'est que tu peux demander à lire ou écrire des 'fiches' dans n'importe quel ordre.

Si tes données ne sont pas structurées, tu ne pourras pas écrire par dessus la donnée.
Il va te falloir lire une ligne du fichier, la traiter (ou pas), puis l'écrire dans un autre fichier.
Après traitement, tu peux supprimer l'original et renommer le nouveau fichier comme l'ancien.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
Messages postés
13
Date d'inscription
samedi 25 novembre 2006
Statut
Membre
Dernière intervention
5 juin 2010

bonjour
je te remercie tout d'abord pour ta reponse qui est certainement bonne sauf que j'ai un problème par rapport à mon fichier Montant.txt
lorsque le programme exécute la ligne
Get #ff, NoLigne, MyRecord
le NoLigne est vide d'ou plantae erreur 63 
A noter que pour ce test j'ai crée manuellement un fichier .xls avec trois zones  
VS01, VS02  VS03  ensuite j'ai enregistré ce fichier sous .txt  
   4          D     200
le séparateur des zones étant la tabulation et pour les enregitrements entrée

Voici mon source

Private Type Record
 VS01 As String * 10
 VS02 As String * 10
 VS03 As String * 10
End Type
Sub Conversion()
                
Dim MyRecord As Record, NoLigne


Dim sValueLettres As String
Dim CaractèreDeFinDeLigne As String * 2


 ff = FreeFile
Open "C:\temp\Montant.txt" For Random Access Read Write As #ff Len = Len(MyRecord)
 
   Do While Not EOF(ff)
   Get #ff, NoLigne, MyRecord
      
    ' traitement
 If VS03 <> "" Then
         txt_Nb_Text = VS03
         Call ChiffresLettres_F((CDbl(txt_Nb_Text)), sValueLettres)
       
    Put #ff, NoLigne, MyRecord
 
 End If


Loop
Close #ff
  
End Sub

Merci pour ton aide

MM
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Essaie comme ceci.
L'index de ligne (NoLigne) doit être supérieur à 0

Sub Conversion()
    Dim MyRecord As Record, NoLigne As Long, FF As Integer
    Dim sValueLettres As String
    Dim CaractèreDeFinDeLigne As String * 2
   
    FF = FreeFile
   
    Open "C:\temp\Montant.txt" For Random As #FF Len = Len(MyRecord)
   
    Do While Not EOF(FF)
        NoLigne = NoLigne + 1       'doit être > 0
        Get #FF, NoLigne, MyRecord
       
        ' traitement
        If MyRecord.VS03 <> "" Then
        MsgBox MyRecord.VS01 & vbCrLf & MyRecord.VS02 & vbCrLf & MyRecord.VS03
'         txt_Nb_Text = MyRecord.VS03
'         Call ChiffresLettres_F((CDbl(txt_Nb_Text)), sValueLettres)
'
'    Put #FF, NoLigne, MyRecord
       
        End If
    Loop
    Close #FF
 
End Sub

MPi
Messages postés
13
Date d'inscription
samedi 25 novembre 2006
Statut
Membre
Dernière intervention
5 juin 2010

Merci Bcp pour ton aide, ça avance bien mais désolé de t'ennuyer un peu plus car je récupére bien des données mais elle sont décalées ainsi
mon fichier et comme suit  ( séparateur tabulation pour les zones et entrée pour les enregistrements) 
VS01    VS02       VS03
4             E          1235,12
15          D          2580,56

lorque j'exécute le source je récupère dans
MyRecord.VS01="VS01VS02"
MyRecord.VS02="VS03 4E"
MyRecord.VS03="1235,12 1"
Alors que je veux récupérer
Enregistrement 1
MyRecord.VS01="VS01"
MyRecord.VS02="VS02"
MyRecord.VS03="VS03"
Enregistrement 2
MyRecord.VS01="4"
MyRecord.VS02="E"
MyRecord.VS03="1235,12"
Enregistrement 3
MyRecord.VS01="15"
MyRecord.VS02="D"
MyRecord.VS03="2580,56"

MM
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
La méthode Random pour la lecture de fichier est intéressante lorsqu'on a des données ayant des espacements fixes. C'est à ça que sert le Type. Dans ton cas, le Type était de 3 données de 10 caractères de long.

Par contre, le fichier que tu essaies de lire ne doit pas avoir 3 données de 10 caractères. Ce sont simplement 3 variables de longueur non définie. Il serait préférable d'utiliser alors

Open "MonFichier" For Input as #ff
Ensuite utiliser Line Input pour lire une ligne
Puis utiliser Split sur cette ligne avec vbTab comme délimiteur
Le tableau généré par Split contiendra alors les 3 (ou plus) valeurs de chaque ligne

Est-ce que tu comprends mon charabia ?

MPi
Messages postés
13
Date d'inscription
samedi 25 novembre 2006
Statut
Membre
Dernière intervention
5 juin 2010

Bonjour
Pour ton information c'est plutôt moi qui suit Charabia et grace à tes informations j'ai pu en tout cas avancer dans la compréhension du traitement de fichier texte et je t'en remercie bcp.
voici ce que j'ai écrit mais je ne sais pas aller plus loin
 FF = FreeFile
        Open "C:\temp\Montant.txt" For Input As #FF
        Do While Not EOF(FF)
            Line Input #FF, textline
            tabul = Split(textline, vbTab) 
quand j'exécute ce source j'ai dans texteline ce qui suit
"VS01*VS02*vs03*VS04"      *=correspond ici à la tabulation
"4*E*1235,12*Durand"
"15*D*2580,56*Dupont"
l'idéee est de savoir comment récupérer la position de VS03 entre deux tabulations afin de la traiter.
 
ce que je sais dire mais pas écrire en VB

J'ai volontairement ajouter une zone dans mon fichier VS04 pour pouvoir avoir VS03entre deux tabulations

Et merci bcp 

MM
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
L'ajout de VS04 n'est pas nécessaire.
Lorsque tu écris
tabul = Split(textline, vbTab)  ' en espérant que tabul est un tableau ... tabul()
celui-ci contiendra
tabul(0) => VS01
tabul(1) => VS02
tabul(2) => VS03

............... tant qu'il y aura des tabulations sur cette ligne

Tu peux donc mettre une condition sur tabul(2)
If CDbl(tabul(2)) > 1500 then ....
ou
If tabul(2) <> "" then

Bonne chance

MPi