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

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

          merci
          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. Re

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

              merci pour ton aide
              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. 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. 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. 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. 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. 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. Tu pourras remplacer les "," en"." avec le bloc note dans le menu edition --> remplacer --> "," par "." --> Remplacer tout

                            Bonne cance
                            0
                            1. Re
                              Mais comment remplacer "," par "." si le fichier comporte des milliers de valeurs?
                              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. 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. 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