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

VB 6 et antérieur Discussion :

Linges sautées dans "lecture" d'un fichier .csv


Sujet :

VB 6 et antérieur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 89
    Par défaut Linges sautées dans "lecture" d'un fichier .csv
    Bonjour,

    Je "charge" un fichier .csv dans un recordset comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim cn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
     
    Set cn = New ADODB.Connection
    Set rs = New ADODB.Recordset
     
    cn.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
        PathMonFichier.Caption & "Extensions=asc,csv,tab,txt"
     
    Call rs.Open("Select *  From [" & monFichier &  "]", cn, adOpenDynamic)
    Le chargement semble bien se passer mais en bouclant à travers mon recordset je vois que le contenu de certaines lignes n'ont pas été lues. La ligne est là mais vide. Le nombre de ligne dans le recordset est le bon mais avec certaines lignes vides (j'ai "exporté" mes données dans un fichier excel via VB pour être en mesure de voir le nombre de ligne puisque le recordcount me donne toujours -1 même après un movefirst suivi d'un movelast).

    À noter que l'ouverture directe du fichier csv par excel contient bien toutes les données dans les bonnes colonnes. À noter également que le fichier csv est obtenu par une extraction avec impromptu dans un autre établissement et je n'ai aucun pouvoir sur son contenu... bien qu'il semble ok lorsque je le regarde avec Excel.

    Quelqu'un a une idée, une piste de solution?

    Merci pour votre aide!

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 89
    Par défaut
    J'avance dans la résolution de mon problème...

    Le problème vient d'un format d'une colonne. J'ai dans le fichier csv une colonne qui contient des données du type "1,25" . Peu importe que j'utilise le point ou la virgule comme séparateur de décimale, il interprète cette valeur comme 01:25:00. C'est effectivement une durée mais dans un format HH,DD. Ce qui veut dire que 1,25 = 01:15:00. Moi je veux utiliser la valeur comme étant 1.25. Les lignes qui restent vide sont celle qui ont des valeurs du genre 0,92 (qui signifie en fait 55 minutes) mais il n'est pas capable d'interpréter cette valeur.

    La question est donc, peut-on définir un format avant d'avant d'aller chercher les données dans le fichier csv pour que cette colonne soit interprétée de la bonne façon.

    PS : J'ai 19 établissement qui me fournissent ce fichier et pour certains c'est un "." et pour d'autre c'est une "," qui se trouve dans cette colonne à problème. J'imagine que ça dépend de leur paramètre régionnaux...

    Merci

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 730
    Par défaut
    Salut,

    ...pour être en mesure de voir le nombre de ligne puisque le recordcount me donne toujours -1 même après un movefirst suivi d'un movelast
    Il y a un post qui traite de ce problème, qui est dû, d'après mes souvenirs, au positionnement du curseur (client ou serveur). Fais une recherche avec "adUseServer" ou "AdUseClient".

    La question est donc, peut-on définir un format avant d'avant d'aller chercher les données dans le fichier csv pour que cette colonne soit interprétée de la bonne façon.
    Je ne vois pas de notion de séparateur dans le driver "Text" que tu utilises.

    N'oublie pas qu'un .csv est tout simplement un fichier texte dont les enregistrement comprennent un séparateur (";", "TAB"... ouvre le dans le bloc-note).
    Tu devrais penser à modifier ta façon de remplir ton recordset en gérant ton .csv comme un simple fichier texte dont tu liras les lignes une à une. Tu peux créer une fonction assez simple qui te permettra de gérer tous les cas (séparateur ";", formatage des enregistrements numériques etc.)

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 89
    Par défaut
    Merci Phifi,

    Avec tes commentaires, j'ai fait de nouvelles recherches et j'ai pu résoudre un de mes problèmes et avancer sur l'autre.

    Donc pour avoir le bon recordcount j'ai ajouter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rs.CursorLocation = adUseClient
    et ça résoud le problème.

    Pour la colonne à problème, j'ai modifié la façon d'ouvrir ma connection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
           "Data Source=" & path & _
           ";Extended Properties=""text;HDR=Yes;FMT=Delimited"""
    De cette façon, je n'ai plus des lignes intièrement vide mais seulement la colonne en question demeure vide.

    Quand tu dis :
    Tu devrais penser à modifier ta façon de remplir ton recordset en gérant ton .csv comme un simple fichier texte dont tu liras les lignes une à une.
    Est-ce que tu parles de quelque chose du genre ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Open "c:\path\monfichier.csv" For Input ...
    Merci pour ton aide

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 730
    Par défaut
    Est-ce que tu parles de quelque chose du genre ? :
    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Open "c:\path\monfichier.csv" For Input ...
    Oui, exactement.

    C'est de cette façon que je gère les .csv en tout cas. Je récupère chaque ligne et une fonction m'extrait les colonnes dans un tableau que je traite avant le "Line Input" suivant.

    Honnêtement, je ne sais pas si c'est plus lent/rapide que ta méthode.
    L'avantage que j'y vois est que je peux traiter chaque enregistrement avant de les insérer dans le recordset : cela résoud les problèmes de point ou de virgule, de simple ou double quote, le formatage de date, de montant etc. On ne sait jamais ce qu'on peut trouver dans des .csv...

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 89
    Par défaut
    C'est une solution intéressante. Pour le moment je pense que ça peut répondre à mes besoins, je ne vois pas pour l'instant ce qui m'empêcherait d'utiliser cette façon faire (utiliser un tableau plutôt qu'un recordset). Sinon, faut que je demande à la personne qui a construit la requête dans impromptu de faire une correction pour éviter d'avoir une virgule au lieu d'un point dans cette colonne (si ça peut se faire!)

    Merci Phifi pour ton aide!

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

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