IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

ReadLine n'arrive pas ài identifier les lignes de mes fichiers csv [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 78
    Par défaut ReadLine n'arrive pas ài identifier les lignes de mes fichiers csv
    Bonjour à tous,

    Afin de ne plus être tributaire des différents paramètres régionaux d'Excel et de Windows, je cherche à charger les données de fichiers csv directement dans des variables tableaux.
    Pour cela, je passe par Scripting.FileSystemObject.
    J'ai activé la référence Microsoft Scripting Runtime
    Voici un bout de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Dim line As String, Arr
    Dim FSO As Object, Fo As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set Fo = FSO.OpenTextFile("(chemin de mon fichier)\D20220416test.csv", ForReading, False, TristateFalse)
     
    While Not Fo.AtEndOfStream
     line = Fo.ReadLine      ' sensé lire le csv ligne par ligne mais dans mon cas lit l'ensemble des lignes
     Debug.Print line         'voir résultat ci-dessous
     Arr = Split(line, ";")  ' ne peut pas fonctionner correctement
     'etc......
     
    Wend
    Fo.Close
    Set Fo = Nothing
    Set FSO = Nothing
    Le problème c'est que ReadLine (ligne 7) qui est sensé lire une ligne entière (jusqu’au caractère de retour à la ligne, sans l’inclure, dixit l'aide) n'arrive pas à identifier les lignes et lit systématiquement la totalité du fichier en une seule passe.
    Le résultat c'est qu'il n'y a aucune colonne identifiable et la dernière donnée de la ligne est collée à la première de la ligne suivante.
    Bref, je n'arrive pas à exploiter les données.

    Pourtant, le debug.print de l'unique extraction montre bien les lignes de mon csv :
    16/04/22 11:00;0,76;8,26;2,84;372,00;7,55;5,50;517,8
    16/04/22 12:00;0,76;8,26;2,84;372,00;7,55;5,50;517,8
    16/04/22 13:00;0,76;12,58;2,84;363,00;7,52;5,50;517,8
    16/04/22 14:00;0,76;12,58;2,84;363,00;7,55;5,50;517,8
    16/04/22 15:00;0,76;12,58;2,84;363,00;7,55;5,50;517,8
    16/04/22 16:00;0,76;12,58;2,84;363,00;7,55;5,50;517,8
    16/04/22 17:00;0,76;16,41;3,01;330,00;7,55;5,50;548,8
    16/04/22 18:00;0,76;16,41;3,01;330,00;7,55;5,50;548,8
    16/04/22 19:00;0,76;16,41;3,01;330,00;7,55;5,50;548,8
    16/04/22 20:00;0,76;16,41;3,01;330,00;7,55;5,50;548,8
    16/04/22 21:00;0,78;20,00;3,16;310,00;7,55;5,50;576,2
    16/04/22 22:00;0,78;20,00;3,16;310,00;7,55;5,60;576,2
    16/04/22 23:00;0,77;22,04;2,94;285,00;7,55;5,50;536,1
    17/04/22 00:00;0,77;22,04;2,94;285,00;7,55;5,50;536,1
    et si j'ouvre le fichier dans le bloc note, les lignes sont bien là. Idem avec Excel qui sait mettre directement ces données en tableau. J'en conclue que le caractère de retour de ligne est bien présent, sinon les données ne pourraient pas être extraites.

    Le résultat est le même pour les deux versions d'Excel que j'ai : 2010 et 2016
    Je n'arrive pas à trouver ce qui coince.

    Merci à ceux qui pourront m'aider à comprendre et surtout à résoudre ce mystère.

    Ci-joint un des fichiers que je cherche à extraire.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 078
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Il y a deux caractères de retour à la ligne en informatique
    pris sur un forum :

    Le retour de ligne est '\n' sur les systèmes UNIX, '\r' sous Macintosh (et peut-être MacOS X, je ne sais pas) et '\r\n' sous DOS/Windows
    en VBA, on peut faire appel à ces caractères par vbCr (ou Chr(13) il me semble) ou vbLf (Chr(10))
    vbCrLf représente les 2 (chr(13) & chr(10))
    donc il faut voir si FileSystemObject.OpenTextFile te permet de spécifier ce caractère, ou il faudra envisager une autre méthode d'ouverture (il y en a d'autres, Open par exemple)
    Pas encore cherché plus avant

  3. #3
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 078
    Billets dans le blog
    2
    Par défaut
    En ouvrant ton fichier CSV dans le bloc notes, il écrit dans la barre d'état chez moi MacIntosh (CR)
    donc ton retour à la ligne doit être vbCr

  4. #4
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 078
    Billets dans le blog
    2
    Par défaut
    un code qui devrait marcher
    (à adapter)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub litLignes()
    Dim Strm As Object, Ligne As String
        Set Strm = CreateObject("ADODB.Stream")
        Strm.Open
        Strm.LineSeparator = 13
        Strm.Charset = "utf-8"
        Strm.LoadFromFile "C:\toto\D20220416test.csv"
        Do Until Strm.EOS
            Ligne = Strm.ReadText(-2)
            MsgBox Ligne
        Loop
        Strm.Close
        Set Strm = Nothing
    End Sub

  5. #5
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 178
    Par défaut
    hello,
    on peut aussi lire tout le contenu du fichier csv en une seule chaîne avec un readAll que l'on divise en lignes avec un Split avec le séparateur adéquat.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Sub LireCsv()
    Const ForReading = 1, ForWriting = 2, ForAppending = 8
    Const TristateFalse = 0, TristateTrue = -1
    Dim line, lines, Arr
    Dim FSO As Object, Fo As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set Fo = FSO.OpenTextFile("D:\temp\D20220416test.csv", ForReading, False, TristateFalse)
    lines = Split(Fo.ReadAll, vbCr)
    Fo.Close
     For Each line In lines
        Debug.Print line         
        Arr = Split(line, ";")  
        If UBound(Arr) > 0 Then
             Debug.Print Arr(0) ' on affiche le premier champ des lignes
        End If
    Next
    Set Fo = Nothing
    Set FSO = Nothing
    End Sub
    Ami calmant, J.P

  6. #6
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 78
    Par défaut
    Merci à tous les deux pour votre aide. Il est clair que c'est le caractère de fin de ligne qui n'est pas correct.

    J'ai essayé la solution de tototiti2008 et elle fonctionne très bien avec le fichier que j'ai donné en exemple :
    16/04/22 04:00;0,76;1,57;2,93;196,00;7,54;5,50;534,2
    16/04/22 05:00;0,78;4,00;3,03;221,00;7,54;5,60;552,5
    16/04/22 06:00;0,78;4,00;3,03;221,00;7,54;5,50;552,5
    16/04/22 07:00;0,78;4,00;3,03;221,00;7,54;5,50;552,5
    etc...
    Mais ces fichiers ont une ligne de titre et lorsque je fais l'opération avec les titres, j'ai la deuxième ligne qui est tronquée au début :
    ;Chlore MIN (mg/L);Heure Chlore Min (h,m);Niveau (m);D?bit (L/m);pH;Temp?rature (C);Volume
    4/22 01:00;0,78;0,25;3,04;224,00;7,54;5,50;554,3
    16/04/22 02:00;0,76;1,57;2,93;196,00;7,53;5,60;534,2
    16/04/22 03:00;0,76;1,57;2,93;196,00;7,54;5,60;534,2
    16/04/22 04:00;0,76;1,57;2,93;196,00;7,54;5,50;534,2
    16/04/22 05:00;0,78;4,00;3,03;221,00;7,54;5,60;552,5
    etc...
    Je n'ai pas cherché pourquoi pour le moment, je n'ai fait qu'essayer le code. Je me pencherai dessus dès que j'ai un moment.

    J'ai aussi essayé la proposition de jurassic pork qui semble mieux fonctionner; Chaque ligne est correctement affichée et la première donnée est affichée conformément au code , ce qui donne avec le fichier avec ligne de titre :
    ;Chlore MIN (mg/L);Heure Chlore Min (h,m);Niveau (m);Débit (L/m);pH;Température (C);Volume
    (ici pas de donnée puisque la première de la ligne ci-dessus est vide)
    16/04/22 01:00;0,78;0,25;3,04;224,00;7,54;5,50;554,3
    16/04/22 01:00
    16/04/22 02:00;0,76;1,57;2,93;196,00;7,53;5,60;534,2
    16/04/22 02:00
    16/04/22 03:00;0,76;1,57;2,93;196,00;7,54;5,60;534,2
    16/04/22 03:00
    etc...
    Reste à l'adapter à mon projet.

    Merci encore pour votre aide précieuse qui je pense va me permettre de résoudre mon problème.

  7. #7
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 78
    Par défaut
    Bonjour,

    Finalement j'ai adopté la solution proposée par jurassic pork car elle permet la lecture sur une seule passe.

    Désolé tototiti2008, je n'ai pas vraiment cherché pourquoi j'ai un manque au début de la ligne 2.

    Merci en tout cas à tous les deux pour votre aide qui m'a permis d'avancer.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Je n'arrive pas a afficher les lignes de ma table MYSQL
    Par skander222 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 25/12/2014, 14h16
  2. Compter les lignes d'un fichier CSV à partir d'une ligne
    Par miniRoshan dans le forum Général Java
    Réponses: 6
    Dernier message: 03/06/2010, 11h16
  3. Réponses: 4
    Dernier message: 02/06/2010, 17h23
  4. Scanner n'a pas traité toutes les lignes d'un fichier ?
    Par grandGi32 dans le forum Général Java
    Réponses: 4
    Dernier message: 04/12/2008, 11h43
  5. [CSV] Compter les lignes d’un fichier csv
    Par sam01 dans le forum Langage
    Réponses: 3
    Dernier message: 24/01/2007, 11h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo