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 :

Nettoyer un fichier csv mal formé [XL-2000]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Points : 80
    Points
    80
    Par défaut Nettoyer un fichier csv mal formé
    Bonjour , je suis confronté à un fichier .csv qui est mal formé .(voir pièce jointe)
    Résultat la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Do While Not EOF(numlib)
    ne tourne qu'une seule fois alors qu'elle devrait boucler sur toutes les lignes
    du fichier .Que faire ?
    NB : Le but du programme est de lire le fichier .csv et d'envoyer le flux dans un tableau (aucun travail sur les cellules ou sur un worksheet d'un fichier .xls)

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    Sub Test(fichiercherche)
     
    Dim Chaine, tableau, i, cloture As Long
     
    Dim numlib As Long
    numlib = FreeFile
     
    Open "C:\Documents and Settings\a\Bureau\Seb\" & fichiercherche For Binary As numlib ' #1  '& "\" & fichiercherche & ".txt"
     
    Dim compteur As Integer
    compteur = 0 'pour initialiser
    Dim tableauindicedate()
    Dim tableautotal() 'un tableau avec 7 colonnes
    Dim text As String
     
    Do While Not EOF(numlib)
        Line Input #numlib, Chaine
     
        Debug.Print Chaine  'mal formée je lis un bloc de lignes alors que je m'attend
                            'à lire une seule ligne
     
        tableau = Split(Chaine, ",")  
     
        text = StrConv(Chaine, vbUnicode)
        text = Replace(text, Chr$(26), vbCrLf) ' Remove EOF characters
     
     
     
     If IsNumeric(tableau(4)) = True Then
     
     compteur = compteur + 1
     ReDim Preserve tableautotal(compteur)
     tableautotal(compteur) = tableau
     
     End If
     
    Loop
    Close numlib
     
    ReDim tableauindicedate(compteur)
     
        For i = 1 To compteur
           tableauindicedate(i) = i
        Next i
     
       tableautotal = inversetableautotal(tableautotal)
       'tableautotal = dernierecloture(tableautotal)  'j'appelle encore une fonction qui injectera la cotation du jour
       Call dessineuneligne(tableauindicedate, compteur, tableautotal)
     
    End Sub
    Pièces jointes en attente de validation Pièces jointes en attente de validation

  2. #2
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Bonjour,

    Si tu veux avoir une lecture du fichier ligne à ligne utilise Input au lieu de binary

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Open "C:\Documents and Settings\a\Bureau\Seb\" & fichiercherche For Input As numlib ' #1  '& "\" & fichiercherche & ".txt"
    Jérôme

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Points : 364
    Points
    364
    Par défaut
    Bonjour,
    Il est possible, sinon probable, que le fichier CSV soit issu d'un environnement Unix et que les retour ligne soient des LF, et non des CR LF comme avec windows (je ne peux pas vérifier, la pièce jointe n'a pas encore été validée).
    Dans ce cas Line Input ne reconnaît pas LF comme caractère de fin de ligne (c'est marqué dans l'aide) et considère donc tout le fichier comme une seule grande ligne.
    Une solution, après avoir ouvert le fichier avec Line Input et fait une passe de lecture, serait de faire un split sur le caractère LF - ou chr(10) - ce qui donnerait un tableau de variables d'une seule dimension où chaque "cellule" correspondrait à une ligne du csv. Il faudrait donc ensuite faire la boucle avec le Split(Chaine, ",") etc... sur ce tableau plutôt que sur le fichier csv.
    Je dois avoir un exemple dans un coin si ce n'est pas assez explicite.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Points : 80
    Points
    80
    Par défaut
    Pour jfontaine même en remplacant "binary" par "input" la lecture se fait sur un bloc de lignes (meme pas le fichier en entier)

    Pour neupont , l'idée est bonne .Et je m'en suis sortis en abandonnant la fonction EOF .Décevante , la fonction EOF d'autant que sur d'autres de mes fichiers , cela fonctionnait .

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Sub Test(fichiercherche)
     
    Dim Chaine, tableau, i, j, cloture As Long
    Dim tableauligne As Variant
     
    Dim numlib As Long
    numlib = FreeFile
     
    Open "C:\Documents and Settings\a\Bureau\Seb\" & fichiercherche For Input As numlib
     
    Dim compteur As Integer
    compteur = 0 'pour initialiser
    Dim tableauindicedate()
    Dim tableautotal() 'un tableau avec 7 colonnes
    Dim text As String
     
    Line Input #numlib, Chaine
    tableauligne = Split(Chaine, Chr(10))  ‘permet d’isoler une ligne du fichier
     
     
    For j = LBound(tableauligne) To UBound(tableauligne) - 1
     
        tableau = Split(tableauligne(j), ",")  'rappel la fonction split cree un tableau
     
     
     If  IsNumeric(tableau(4)) = True Then
     
     compteur = compteur + 1
     ReDim Preserve tableautotal(compteur)
     tableautotal(compteur) = tableau
     
     End If
     
     Next
     
    Close numlib
     
    ReDim tableauindicedate(compteur)
     
        For i = 1 To compteur
           tableauindicedate(i) = i
        Next i
     
       tableautotal = inversetableautotal(tableautotal)
       Call dessineuneligne(tableauindicedate, compteur, tableautotal)
     
    End Sub
    Merci à tous les deux .

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

Discussions similaires

  1. [MySQL] lire et nettoyer un fichier csv
    Par bachs dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/04/2010, 14h30
  2. [SimpleXML] Fichier XML distant mal formé
    Par benjyyyyy dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 13/02/2009, 15h59
  3. [CSV] "nettoyer" un fichier csv
    Par lagom dans le forum Langage
    Réponses: 2
    Dernier message: 12/08/2007, 08h41
  4. Correction d'un fichier xml mal formé
    Par devlo dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 25/10/2006, 11h30
  5. [xml] fichier mal formé
    Par kikimnet dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 25/11/2005, 09h30

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