[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

17 réponses

  1. byakhlefncr Messages postés 260 Statut Membre 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
  2. 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
  3. byakhlefncr Messages postés 260 Statut Membre 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
  4. sadya
     
    Re
    Mais comment remplacer "," par "." si le fichier comporte des milliers de valeurs?
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. byakhlefncr Messages postés 260 Statut Membre 63
     
    Tu pourras remplacer les "," en"." avec le bloc note dans le menu edition --> remplacer --> "," par "." --> Remplacer tout

    Bonne cance
    0
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. sadya
     
    Re

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

    merci pour ton aide
    0
  14. 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
  15. sadya
     
    salut lupin

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

    merci
    0
  16. 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
  17. 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
  18. arf
     
    essaie d'utiliser le ";" comme séparateur plutôt que la ",". normalement ça marche très bien.
    0