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

C Discussion :

Extraire des données dans un fichier .csv


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 98
    Points : 65
    Points
    65
    Par défaut Extraire des données dans un fichier .csv
    Bonjour,

    je voudrais extraire des données que j'ai dans un fichier .csv ou xls peut importe mais il me semble plus facile de le faire avec un .csv.

    Je veux donc lire dans ce fichier et rentrer les données dans un tableau.
    J'ai commencer mon code en ouvrant le fichier mais il ne veut meme pas lire la premiere ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if ((fd_o = fopen("P:\\METHODES\\PERSONNEL\\JORSET\\test1.csv", mode_fichier)) == NULL) 
    return(1);
     
    while ((!feof(fd_o)) && fgets(ligne, sizeof(ligne), fd_o) != NULL)
    {
    strcpy(tab[i], ligne);
    i++;
    }
    si qq un avait un code "FACILE" pour ce genre de traitement.

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par orj30754
    je voudrais extraire des données que j'ai dans un fichier .csv ou xls peut importe mais il me semble plus facile de le faire avec un .csv.

    Je veux donc lire dans ce fichier et rentrer les données dans un tableau.
    J'ai commencer mon code en ouvrant le fichier mais il ne veut meme pas lire la premiere ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((!feof(fd_o)) && fgets(ligne, sizeof(ligne), fd_o) != NULL)
    [c'est code et pas quote ...]

    feof() ne fait pas ce que tu crois. Il faut tester la valeur retournée par fgets().

    http://emmanuel-delahaye.developpez....s.htm#fichiers

    Ensuite, pour parser le CSV, tu peux utiliser strtok() si tu n'est pas regardant sur les problème de ré-entrance. Sinon, il faut faire son parseur soi même (c'est trivial).

    Fait de ton mieux et poste ton code

    Au fait, ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ((fd_o = fopen("P:\\METHODES\\PERSONNEL\\JORSET\\test1.csv", mode_fichier)) == NULL)
    return(1);
    est horrible !
    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
     
    #define FNAME "P:\\METHODES\\PERSONNEL\\JORSET\\test1.csv"
     
       FILE *fp = fopen(FNAME, "r");
       if (fp != NULL)
       {
          char line[TAILLE_QUI_VA_BIEN];
     
          while (fgets (line, ...)...)
          {
          }
       }
       else
       {
          perror (FNAME);
       }
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 98
    Points : 65
    Points
    65
    Par défaut
    Ce qu'il me faut c'est une instruction qui puisse lire ligne a ligne ou colonne par colonne le fichier excel ou csv

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 66
    Points : 62
    Points
    62
    Par défaut
    je déconseille strtok. Je ne sais pas ce que Emmanuel entend par réentrance, mais strtok altère la chaîne traîtée. A la limite, on s'en fiche, mais surtout, si tu as un champ vide (donc deux ';' à la suite), strtok considère qu'il n'y a qu'une séparation. et donc au final, ta ligne se retrouve amputé d'un champ du point de vue strtok.

    Pour moi, tester la valeur de fgets ne suffit pas, il faut aussi regarder feof comme tu l'as fait. Par contre, tes conditions sont légèrement à changer car si la fin du fichier est atteinte en cours de ligne fgets peut quand même avoir récupéré des choses, et tu ne lirais pas cette dernière ligne avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((!feof(fd_o)) && fgets(ligne, sizeof(ligne), fd_o) != NULL)
    il faut arrêter quand fgets retourne NULL et que feof renvoie != 0.

    Effectivement parser une telle ligne ne m'a pas paru trop difficile. Puisque la mode est de laisser un peu réfléchir, je ne recopierai pas ce que j'ai fait (pour le moment )

    Par ailleurs, la façon de coder est une question de goût. Par ex, ce que propose emmanuel, moi je trouve ça moyen car on imbrique vite des sections en codant ainsi. Autant traiter l'erreur de suite et sortir, et sinon continuer. Moi je ferais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if( (fp = fopen(...)) == NULL) {
    erreur();
    sortie();
    }
     
    while(fgets(..., ..., fp) != NULL) {
    /* traitement */
    }
    à toi de voir...

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par orj30754
    Ce qu'il me faut c'est une instruction qui puisse lire ligne a ligne ou colonne par colonne le fichier excel ou csv
    J'ai bien compris et je t'ai donné tous les éléments. Tu ne veux pas que j'écrive le code à ta place, non ?
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par benhoeil
    je déconseille strtok. Je ne sais pas ce que Emmanuel entend par réentrance, mais strtok altère la chaîne traîtée.
    C'est moins grave que le problème de non réentrance du à l'usage d'une statique dans strtok(). (Nota : la fonction POSIX.1 strtok_r() regle ce problème. r comme réentrant).
    A la limite, on s'en fiche, mais surtout, si tu as un champ vide (donc deux ';' à la suite), strtok considère qu'il n'y a qu'une séparation. et donc au final, ta ligne se retrouve amputé d'un champ du point de vue strtok.
    Ca, c'est un vrai problème (auquel je ne pensais plus, car ça fait longtemps que j'ai résolu ce problème : http://emmanuel-delahaye.developpez.com/clib.htm Module TOK)
    Pour moi, tester la valeur de fgets ne suffit pas, il faut aussi regarder feof comme tu l'as fait.
    Ah bon ? Ca sert à quoi ? C'est pas une question de "pour toi" ou "pour moi", mais de suivre la définition des fonctions standards du langage C.

    La seule façon de savoir su la lecture c'est interrompue est de tester la valeur retournée par la fonction de lecture. feof() sert a posteriori pour identifier la cause exacte de l'arrêt, ce qui est rarement utile. Tu as lu mon lien sur le sujet ?
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 66
    Points : 62
    Points
    62
    Par défaut
    je n'ai pas lu le lien.

    "pour moi" = mon avis. Je peux bien sûr me tromper et c'est pour ça que je suis là. D'ailleurs je pense que tu as raison !

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par benhoeil
    je n'ai pas lu le lien.
    Tu devrais...
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Extraire des données dans un fichier
    Par kali38 dans le forum Général Python
    Réponses: 4
    Dernier message: 31/01/2011, 13h51
  2. [Batch] Extraire des données d'un fichier CSV
    Par soufianekh dans le forum Scripts/Batch
    Réponses: 11
    Dernier message: 27/10/2009, 13h34
  3. Extraire des données d'un Fichier .csv
    Par wolverine1987 dans le forum MFC
    Réponses: 47
    Dernier message: 20/05/2009, 15h48
  4. Réponses: 5
    Dernier message: 05/12/2008, 15h23
  5. Extraire des données d'un fichier .csv avec C++
    Par cre31400 dans le forum C++Builder
    Réponses: 14
    Dernier message: 08/07/2008, 10h25

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