[VB6] fichier

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. 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
    1. 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
      1. 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
        1. Re
          Mais comment remplacer "," par "." si le fichier comporte des milliers de valeurs?
          0
          1. Tu pourras remplacer les "," en"." avec le bloc note dans le menu edition --> remplacer --> "," par "." --> Remplacer tout

            Bonne cance
            0
            1. 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
              1. 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
                1. 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
                  1. 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
                    1. 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
                      1. 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
                        1. Re

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

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

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

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