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 :

Problème de 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 averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 18
    Par défaut Problème de lecture d'un fichier .csv.
    Bonjour,

    Habitué a consulter ce forum en tant que lecteur, je viens vers vous en cette belle apres midi (dans le sud ouest en tout cas).

    Je suis actuellement confronté a un problème que je n'arrive pas a résoudre. Celui ci concerne comme il est indiqué dans le titre de ce message la lecture d'un fichier .csv.

    Le réel problème vient du fait que je travaille sur 2 environnements différents, sur le premier la lecture de ce fichier .csv se fait sans problème et toute les macros qui reposent la dessus se déroule sans soucis.
    C'est sur le second que cela se corse. A savoir que sur ce second PC je n'ai pas Microsoft Visual basic installé, je n'ai que le Visual basic for application d'installé.
    Afin de comprendre d'ou venait le probleme vu que je n'avais pas la possibilité d'utiliser le mode pas a pas (n'ayant pas VB6 d'installé), j'ai généré un fichier txt dans lequel je trace l'avancé du programme. C'est comme ca que j'en suis venu a comprendre que la lecture du fichier csv fichait tout en l'air.
    Voici un extrait de mon fichier txt généré (sur les 2 environnements différents).

    Environnement 1 (environnement OK):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Source        
    SELECT * FROM Extract.csv WHERE [F2] Is Not Null ORDER BY [F2]
     
    Matches.count est :         1
    La valeur suivante a bien été recueillie  21
    Bookmark :              1
    Field Name:   F1
    Field Value:  153
    Field Name:   F2
    Field Value:  21-20
    F1 colonne 1, F2 colonne 2, on retrouve la valeur 153 dans la colonne F1 et la valeur 21-20 dans la colonne F2 pour la premiere ligne. A savoir qu'il y a 21 colonnes donc F1-F21.

    Et cela sur 117 lignes, car il y a 117 lignes dans mon fichiers .csv.


    Environnement 2 (environnement ou cela ne marche pas):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Source        
    SELECT * FROM Extract.csv WHERE [F2] Is Not Null ORDER BY [F2]
     
    Matches.count est :         0
    L4 :Bookmark :              1
    Field Name:   F1
    Field Value:  1007;34-42;RA;A;1;A429;Multi;1;1;No;RA 1;LRU;XCVR-RA
    Field Name:   F2
    Field Value: 1;1;0x0043;standard;0x0007;N/A;10.142.16.7;SCI_BITE_A429_OUT_1_1_1;N/A

    Maintenant sur le second environnement ou cela ne marche pas, on s'apercoit que dans la colonne F1 on récupère 13 valeurs, et dans la colonne F2 8 valeurs. La par contre, il n'y a que 2 colonnes et non 21.

    J'en suis venu a comprendre que cela venait de la lecture du fichier. En fait si la fin du champs F1 se termine sur "XCVR-RA", c'est parce que cette ligne contient une ",". Il semblerait donc que dans cette environnement la gestion des fichiers .csv se fait sur la "," et non sur la valeur habituelle du ";".

    Dans ce fichier on ne récupere que 14 lignes. Car il y a 14 lignes dans mon fichiers de 117 lignes avec des ",".


    J'ai donc pensé que cela venait d'une dll qui ne serait pas a jour, mais je ne sais vraiment pas vers laquelle me tourner =(

    Je ne veux pas m'amuser a modifier les dll au petit bonheur la chance. J'ai donc crée une variable d'environnement utilisateur "Path=.;" qui permet d'indiquer au PC lorsqu'il recherche une DLL, de rechercher dans le répertoire courant (indiqué par le "."). j'ai mis les dll suivantes dans mon répertoire courant qui contient le .exe de mon application:

    user32.dll
    secur32.dll
    oleaut32.dll
    rpcrt4.dll
    ntdll.dll
    ole32.dll
    msvcrt.dll
    msvcrt20.dll
    msvbvm60.dll
    kernel32.dll
    gdi32.dll
    advapi32.dll
    vb6fr.dll

    Concernant le choix de ces dll, j'ai utilisé le dependency walker sur le .exe de l'environnement 1, et j'ai regardé celles utilisées.

    C'est la première fois que je suis confronté a un tel probleme, je m'y prend peut etre mal vis a vis de la solution a y apporter et suis tout ouïe.


    Merci par avance pour le temps que vous aurez consacré a lire ce message, en espérant ne pas avoir fait d'entorse au règlement du forum sur la syntaxe des messages.

  2. #2
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Bonsoir,

    ce n'est pas un problème de dll mais de paramétrage de ton système et des options régionales

    voir menu démarrer/Panneau de configuration/Option régionale et linguistique/Onglet Options régionale/Personnaliser/ Séparateur de liste.



  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 18
    Par défaut
    Bonjour,

    Merci pour votre réponse. Mais il se trouve qu'apres vérification, le séparateur de liste est bel et bien ";" sur les 2 PCs.

    Si jamais vous auriez d'autres idées, je suis tout ouïe et vous en serez reconnaissant.

  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 351
    Par défaut
    Bonjour,

    J'ai déjà eu le pb et j'avais contourné le probléme en remplaçant les virgules par une balise [virg] avant l'extraction puis en remétant la vigule au traitement des chaines.

    C'est probablement pas la meilleure solution, mais c'est vite mis en place.

    La où le problème devient insoluble, c'est lorsqu'il y a des ; dans le texte...

  5. #5
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Citation Envoyé par Azuchi Voir le message
    ... A savoir que sur ce second PC je n'ai pas Microsoft Visual basic installé, je n'ai que le Visual basic for application d'installé....
    je ne comprends pas cette phrase qu'appelle-tu "installer le VBA" ?


    quel code utilise tu pour lire ton fichier csv.?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 18
    Par défaut
    @Pascal:

    Le fichier que j'utilise en csv est un fichier qui n'est pas été crée via le langage VB. C'est un fichier que je ne fais que lire. Il est déjà écris et complet avant le lancement de mon application VB6. Je ne peux donc pas venir y écrire et remplacer chaque virgule par une balise [virg], ce fichier doit resté tel quel.

    @bbil:

    En fait ce que j'essayais de dire, c'est que sur le pc sur lequel l'applciation ne tourne pas, je n'ai pas Microsoft VIsual basic 6 d'installé. Sur ce poste là, seul le composant "Visual basic for application" a été installé, de ce que j'ai cru comprendre cet .exe est "un fichier exécutable auto-extractible qui installe les dernières versions des fichiers d'exécution Microsoft Visual Basic requis par toutes les applications créées avec Visual Basic 6.0".

    Je peux me tromper, mais je pensais que cela était suffisant a l'utilisation de mon application réalisé en VB6 sur mon autre PC.


    Ensuite je viens lire mon fichier csv, via mon application développé sous VB6.
    (j'ai crée un fichier Monappli.exe afin qu'il puisse etre exécutable sur le PC ne disposant pas de Microsoft visual basic d'installé).

    J'espere avoir réussi a me faire comprendre, et vous donnerez plus d'informations si necessaire.



    Cela dit, je pense que cela concerne bien les paramétrage régionnal comme tu me l'as précisé pour ta premiere réponse. Je me demande juste s'il n'y a pas un "autre endroit" ou VB irait chercher la description de son séparateur de liste.


    Merci a vous pour le temps que vous me consacrez

  7. #7
    Membre Expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Par défaut
    Bonjour,

    peux tu nous montrer le code de ton programme, en tout cas la portion de lecture et d'extraction des données du fichier csv ?
    S'il n'est pas trop volumineux, mets nous également ton fichier csv.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 18
    Par défaut
    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
     
     
    'Avec le pattern suivant: "^([0-9][0-9])(\-[A-Z0-9][A-Z0-9])$"
    g_objRegExp.Pattern = strBITEATAPattern
     
    'Requete SQL me récupérant dans une colonne toutes les valeurs non nulles.
    reqSQL = "SELECT * FROM " + tableStrBITESD+ " WHERE [F2] Is Not Null ORDER BY [F2]"
     
    'A l'objRecordset je lui assigne le resultat de la requete.
    Set objRecordset = g_objConnection.Execute(reqSQL)
     
    'Pour chaque valeur trouvé dans la colonne F2 non nulle, je stocke la valeur de celle ci dans mon objet.
     
    While Not objRecordset.EOF
            Set g_objetMatches = g_objRegExp.Execute(objRecordset("F2").value)
     
            If g_objetMatches.Count > 0 Then
                strMatch = g_objetMatches.Item(0).SubMatches(0)
                If objet.Exists(strMatch) = False Then
                    objet.Add strMatch, ""
                End If
            End If
     
            objRecordset.MoveNext
     
    Wend
     
    objRecordset.Close
    Set objRecordset = Nothing


    Ensuite mon fichier csv est un fichier de 117 lignes pour 21 colonnes.

    Le problème étant comme expliqué dans mon premier message, que suivant l'environnement sur lequel je me trouve, la macro va utilisé le séparateur de liste suivant "," ou ";".

    J'ai testé a partir de l'environnement qui n'utilise pas le séparateur ";" mais qui utilise la ",", de remplacer justement les ";" de mon fichier csv par des ",". A partir de ce moment la, la lecture du fichier se fait correctement... mais ce n'est pas le but, je veux pouvoir l'exécuter ma macro avec le séparateur ";".

    Sinon le fichier .csv en lui meme est basique, voici un aperçu tronqué car assez gros:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    1;31-60;CDS;B;1;AFDX;Multi (Side 0 is exclusive, Side 3 is single);0;N/A;No;CDS;LRU;DU CL ;1;0x0038;standard;N/A;N/A;10.2.44.1;N/A;N/A
    1;31-60;CDS;B;1;AFDX;Multi (Side 0 is exclusive, Side 3 is single);0;N/A;No;CDS;LRU;DU CR;1;0x0039;standard;N/A;N/A;10.2.76.1;N/A;N/A
    1;31-60;CDS;B;1;AFDX;Multi (Side 0 is exclusive, Side 3 is single);3;N/A;Yes;CDS 3CM;LRU;DU 3CM;1;0x000E;standard;N/A;N/A;10.2.71.1;N/A;DLCS_SPP_INSTRUMENTS_THIRD_FLIGHT_CREW_MEMBER


    On peut voir dans cet extrait du fichier .csv, des "," contenus dans la valeur suivante par exemple:
    - "Multi (Side 0 is exclusive, Side 3 is single)"

    Lors de l'exécution de la macro sur l'environnement 2 (qui ne marche pas), la macro récupère le contenu de cette ligne dans 2 colonnes et non 21. Dans la premiere colonne, il y a le contenu de la ligne jusqu'a la virgule, c'est a dire les 8 premiers champs dans l'exemple ci dessus, puis dans la seconde colonne les 13 champs suivants.

    Et cela pour 14 lignes uniquement car l'on retrouve 14 virgules dans différents champs dans mon fichier .csv.


    J'espère avoir été suffisamment clair...


    [EDIT]: Je pense cependant que cela doit avoir un rapport avec ce que bbil a proposé. Mais il doit y avoir un autre endroit ou VB cherche ce séparateur, est ce possible?

    Encore Merci.

  9. #9
    Membre Expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Par défaut
    Je ne vois pas dans ton code la lecture du fichier csv et encore moins l'extraction des données de ce fichier.

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

Discussions similaires

  1. Problème de lecture d'un fichier CSV via DataSet
    Par frearnaud dans le forum C#
    Réponses: 3
    Dernier message: 22/12/2014, 12h33
  2. Problème de split lors d'une lecture d'un fichier csv
    Par Mawinette dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 25/03/2009, 11h48
  3. Réponses: 2
    Dernier message: 28/12/2005, 15h00
  4. Problème de lecture dans un fichier xml
    Par Pyra dans le forum Langage
    Réponses: 2
    Dernier message: 18/12/2005, 00h13
  5. Réponses: 1
    Dernier message: 20/10/2005, 10h32

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