[VB6] fichier

sadya -  
 arf -
bonjour forum,

jai un fichier txt dont les données sont comme suit


38482,59555 10,19
38482,59565 10,187
38482,59576 10,221

j'ai fait le programme suivant

Private Sub Form_Load()
Dim var1, var2 As Double
Dim ndata As Long
Dim i As Integer
Open "C:\Fichier2.txt" For Input As #1
Open "C:\toto.txt" For Output As #2
ndata = 1
Do While ((Not EOF(1)) And (ndata <= 200))
Input #1, var1, var2
Print #2, var1, var2
ndata = ndata + 1
Loop
Close #1

Close #2

End Sub

il donne ce resultat

38482 59555
10 19
38482 59565
10 187
38482 59576
10 221
38482 59586

Est ce que vous avez une idée

merci d'avance
A voir également:

17 réponses

byakhlefncr Messages postés 260 Date d'inscription   Statut Membre Dernière intervention   63
 
Salut,

J'ai essayé ton code mais il donne un résultat correct

38482 59555
10 19
38482 59565
10 187
38482 59576
10 221
0
sadya
 
salut byakhlefncr,
le resultat correct doit etre comme suit

38482,59555 10,19
38482,59565 10,187
38482,59576 10,221

le programme enléve les virgules je ne sais pourquoi?

merci pour ton aide
0
byakhlefncr Messages postés 260 Date d'inscription   Statut Membre Dernière intervention   63
 
Le problème est lié au ',' qui représente la séparation entre la fraction et la partie entiere

en remplaçant par '.' on obtient le résultat suivant :
38482,59555 10,19
38482,59565 10,187
38482,59576 10,221

Bonne chance
0
sadya
 
Re
Mais comment remplacer "," par "." si le fichier comporte des milliers de valeurs?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
byakhlefncr Messages postés 260 Date d'inscription   Statut Membre Dernière intervention   63
 
Tu pourras remplacer les "," en"." avec le bloc note dans le menu edition --> remplacer --> "," par "." --> Remplacer tout

Bonne cance
0
sadya
 
Re
merci pour ton aide mais je ne pense pas que ca va resoudre le probléme car j'ai plusieurs fichiers txt à traiter
0
Utilisateur anonyme
 
Bonjour,

Suggestion :

Dim var1, var2 As Double
Dim fic1, fic2 As Integer
Dim ndata As Long
Dim i, j As Integer

fic1 = FreeFile
Open "C:\Fichier2.txt" For Input As #fic1
fic2 = FreeFile
Open "C:\toto.txt" For Output As #fic2
ndata = 1

Do While ((Not EOF(fic1)) And (ndata <= 200))
    Line Input #fic1, var1
    j = InStr(1, var1, " ", vbTextCompare)
    var2 = CDbl(Mid(var1, (j + 1)))
    var1 = CDbl(Mid(var1, 1, (j - 1)))
    Print #fic2, var1, var2
    ndata = ndata + 1
Loop

Close #fic1

Close #fic2


Lupin
0
sadya
 
bonjour lupin

le programme fonctionne bien mais il faut ajouter on error resume next avant

var2 = CDbl(Mid(var1, (j + 1)))
si non on aura une erreur de type non compatible

merci pour ton aide
0
Utilisateur anonyme
 
re:

Mon côté perfectionniste me pousse a te suggérer ceci :
Dim var1, tmp As Variant
Dim varDBL1, varDBL2 As Double
Dim fic1, fic2 As Integer
Dim ndata As Long
Dim i, j As Integer

fic1 = FreeFile
Open "C:\Fichier2.txt" For Input As #fic1
fic2 = FreeFile
Open "C:\toto.txt" For Output As #fic2
ndata = 1

Do While ((Not EOF(fic1)) And (ndata <= 200))
    Line Input #fic1, var1
    j = InStr(1, var1, " ", vbTextCompare)
    tmp = Mid(var1, (j + 1))
    varDBL2 = CDbl(tmp)
    tmp = Mid(var1, 1, (j - 1))
    varDBL1 = CDbl(tmp)
    Print #fic2, var1, var2
    ndata = ndata + 1
Loop

Close #fic1

Close #fic2


Explication :

On m'a apprit que lorsque l'on effectue une lecture, on devrait
toujours lire en variant, car on ne sait pas toujours ce qui est à
lire. Une fois la lecture effectué, on la contrôle en effectuant
des conversions.

Est-ce que cela aura un sens pour toi ???

Lupin
0
sadya
 
salut lupin,

j'ai changer un peu le code mais ca ne marche pas a tu une idée?

merci

Dim var1, tmp As Variant
Dim varDBL1, varDBL2 As Double
Dim fic1, fic2 As Integer
Dim ndata As Long
Dim i, j As Integer
Dim tab1() As Double
Dim tab2() As Double
Dim somme1 As Double
Dim somme2 As Double
fic1 = FreeFile
Open "C:\Fichier2.txt" For Input As #fic1
fic2 = FreeFile
Open "C:\toto.txt" For Output As #fic2
ndata = 1

Do While ((Not EOF(fic1)) And (ndata <= 200))
Line Input #fic1, var1
j = InStr(1, var1, " ", vbTextCompare)
tmp = Mid(var1, (j + 1))
On Error Resume Next
varDBL2 = CDbl(tmp)
tmp = Mid(var1, 1, (j - 1))
varDBL1 = CDbl(tmp)
'Print #fic2, var1, var2
tab1(i) = varDBL1
tab2(i) = varDBL2
ndata = ndata + 1
i = i + 1
Loop
somme1 = 0
somme2 = 0
For i = 1 To 200
somme1 = somme1 + tab1(i)
somme2 = somme2 + tab2(i)
Next i
Print #fic2, somme1, somme2
Close #fic1

Close #fic2
0
Utilisateur anonyme
 
rebonjour,

au premier coup d'oeil, il me semble que la variable i n'est
pas initialisé avant l'entrée dans la boucle while !

Et il te faudra effectuer un ReDim de la variable tab() dans
la boucle du while. La je quitte pour le boulot, mais ce soir
je pourrai te coder quelques lignes si tu n'y arrive pas.

Lupin
0
sadya
 
Re

j'ai initialisé i et redimtab mais ca ne donne rien

merci pour ton aide
0
Utilisateur anonyme
 
re:

voilà, ce code fonctionne bien chez moi :-)

    Dim var1, tmp As Variant
    Dim varDBL1, varDBL2 As Double
    Dim fic1, fic2 As Integer
    Dim ndata As Long
    Dim i, j As Integer
    Dim tab1() As Double
    Dim tab2() As Double
    Dim somme1 As Double
    Dim somme2 As Double
    
    fic1 = FreeFile
    Open "C:\Fichier2.txt" For Input As #fic1
    fic2 = FreeFile
    Open "C:\toto.txt" For Output As #fic2
    ndata = 1
    i = 1
    
    Do While ((Not EOF(fic1)) And (ndata <= 200))
        Line Input #fic1, var1
        j = InStr(1, var1, " ", vbTextCompare)
        tmp = Mid(var1, (j + 1))
        varDBL2 = CDbl(tmp)
        tmp = Mid(var1, 1, (j - 1))
        varDBL1 = CDbl(tmp)
        'Print #fic2, var1, var2
        ReDim Preserve tab1(i) As Double
        ReDim Preserve tab2(i) As Double
        tab1(i) = varDBL1
        tab2(i) = varDBL2
        ndata = ndata + 1
        i = i + 1
    Loop
    
    somme1 = 0
    somme2 = 0
    For j = 1 To i
        somme1 = somme1 + tab1(j)
        somme2 = somme2 + tab2(j)
    Next j
    Print #fic2, somme1, somme2
    
    Close #fic1
    Close #fic2


Lupin
0
sadya
 
salut lupin

je vais tester ton code ce soir et apré je te dirai

merci
0
sadya
 
bonjour lupin

j'ai tester le code mais j'ai une erreur "13" type incompatible au niveau de varDBL2 = CDbl(tmp)

si je met on error resume next ya plus d'erreur mais il calcul pas

c'est bizare

merci
0
Utilisateur anonyme
 
Bonjour sadya,

En fait, je n'ai pas retesté le code puisqu'il fonctionne
bien avec l'énoncé que tu avais proposé.

Si le code plante, c'est a penser que la structure du fichier
n'est pas constante.

Ex.:

38482,59555 10,19 
                          10,187 
38482,59576 10,221 
38482,59557   
38482,59568 10,192


ici sur les lignes 2 et 4 il y a possibilité de "bug".

Je te recommande, de valider la structure du fichier
en effectuant plusieurs passage.

Ex.:
    Const LngMin = 15 'Longueur minimum d'une ligne

    Dim var1, tmp As Variant
    Dim fic1, fic2 As Integer
    Dim i, j As Integer
    
    fic1 = FreeFile
    Open "C:\Fichier2.txt" For Input As #fic1
    fic2 = FreeFile
    Open "C:\toto.txt" For Output As #fic2
    i = 1
    Do While ((Not EOF(fic1)) And (ndata <= 200))
        Line Input #fic1, var1
        j = Len(var1)
        If (j < LngMin) Then
            Print #fic2, i, var1
        End If
        i = (i + 1)
    Loop
    
    Close #fic1
    Close #fic2


dans cet exemple, je vérifie la longueur minimum d'une ligne.
en cas d'erreur, la ligne et la valeur sont sauvegarder dans
le deuxième fichier.

en fait, c'est la façon de faire en SAS, on appelle cela
des observations, plutôt que de tout chambouler d'un
coup, on effectue plusieurs passages et à chaque passage
on effectue une "observation"/"opération", ... disons
une explication simple.

Plus loin que cela, il faudra après la lecture de la ligne,
valider la structure de chaque lignes,

... le nombre de caractères
... le nombre d'espaces
... le nombre de virgule
... etc...

Bon courage pour la suite, je demeure disponible si tu as
des questions.

N.B. Cette façon de travailler est une parmi tant d'autres,
quelqu'un d'autres aura peut-être de bonnes idées.
ex.: ouvrir le fichier texte avec EXCEL pour le formatter.

Lupin
0
arf
 
essaie d'utiliser le ";" comme séparateur plutôt que la ",". normalement ça marche très bien.
0