String-char Traitement fichier CSV

Résolu/Fermé
lolofougere Messages postés 44 Date d'inscription samedi 21 février 2015 Statut Membre Dernière intervention 9 juillet 2021 - 22 févr. 2017 à 22:49
lolofougere Messages postés 44 Date d'inscription samedi 21 février 2015 Statut Membre Dernière intervention 9 juillet 2021 - 19 avril 2017 à 22:09
Bonjour à tous,

Je dois réalisé le traitement d'un fichier CSV (soit plein chaine de caractère séparer par des ';' ou des '\n' )

Dans un premier temps j'aimerais les afficher en console puis les stocker dans un tableau bi.

Pour le moment j'arrive soit à afficher sous forme de chaine de caractère mais d'un bloc
soit caractère par caractère et quand je rencontre ';' ou '\n' je fais un TAB ou un retour chariot.

Comment stocker chaque case de mon CSV dans un tableau bi ?


fichier_brut = fopen("conso_annuelle_iris_rpt.csv","r");
    if(fichier_brut!=NULL){
        
        
        while (!feof(fichier_brut)) {
            fgets(cLigne_lue, 81, fichier_brut);
            printf("%s",cLigne_lue);


            //cTampon = fgetc(fichier_brut);
            //printf("%c",cTampon);
            //if(cTampon==';') printf("\t");
            //else if (cTampon=='\n') printf("\n");
        }

        fclose(fichier_brut);
    }








Merci à vous
A voir également:

5 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 23/02/2017 à 14:18
Bonjour,

C'est un devoir ?

Sinon, pourquoi le faire en C ? Ce n'est certainement pas le moyen le commode de le faire, car tu vas devoir faire une gestion de mémoire complexe.

Il y a des langages plus adaptés au traitement de gros fichiers texte, comme Perl, ou Python, où ce que tu veux faire se fait en quelques lignes de code, voire avec des modules directement adaptés au traitement de données CSV (comme le module Perl Parse::CSV).

Cela n'est pas impossible, bien sûr en C, mais cela demande bien plus de travail.

Sur le C et ta question : un tableau "bi", personnellement, je ne sais pas ce que c'est :-)

Si tu veux dire "bi-dimensionnel", il parait évident qu'il faudra plus de 2 dimensions si tu veux stocker toutes les données dans un tableau multidimensionnel. Ou un tableau à une dimension, mais comprenant des struct avec les différents champs récupérés.

Tu as des champs de tailles variables. Il te faudra décider comment tu crées ta structure de données et ta stratégie d'allocation de la mémoire nécessaire.

A titre d'exemple avec ton code en ligne 6 : tu lis les données avec fgets, en les limitant à 81 char, donc tu auras au plus une ligne de 80 char (avec le '\0' final). C'est insuffisant pour lire ta première ligne, qui fait 5597 caractères si le fichier que tu as est bien le même que celui récupérable ici..., à moins que tu ne veuilles conserver en mémoire qu'une partie des champs (sauf que là, tu t'arrêtes en plein milieu du 11ème).

Une stratégie possible est :

- de déterminer la taille de la ligne la plus longue (et éventuellement la plus grande taille de chaque champ aussi et le nombre total de lignes),
- de récupérer les lignes entières avec fgets et un buffer dimensionné pour accueillir cette taille
- d'analyser les caractères composant chaque ligne en les dispatchant dans un tableau de struct dont la mémoire serait dynamiquement ou statiquement allouée


Dal
0
Nessdarth Messages postés 36 Date d'inscription vendredi 16 décembre 2016 Statut Membre Dernière intervention 28 février 2017 3
23 févr. 2017 à 16:17
Un tableau à 2 dimensions est suffisant
Une dimension pour les colonnes et une autre dimension pour les lignes.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
23 févr. 2017 à 16:45
Salut Nessdarth,

Je ne pense pas que cela corresponde à la demande de lolofougere "Comment stocker chaque case de mon CSV dans un tableau bi ?", si par chaque "case" il entend chaque donnée dans un champ de chaque ligne.

Mais après tout, ce n'est pas bête de faire comme tu le suggères, et de n'analyser et distinguer les champs que dans un second temps, quand c'est nécessaire.

En fait, le choix de sa structure de données dépend aussi de ce que lolofougere voudra faire en termes de "traitement", comme il dit.

Dal
0
Nessdarth Messages postés 36 Date d'inscription vendredi 16 décembre 2016 Statut Membre Dernière intervention 28 février 2017 3 > [Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024
23 févr. 2017 à 16:56
Il parait évident en regardant le fichier exemple, qu'il est plus judicieux de définir une structure, comme en plus dans une ligne on a aussi bien du numérique que des chaînes.

struct MonItem
{
  int Annee;
  ...
  char Nom[64];
  ..
}
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
23 févr. 2017 à 17:04
C'est ce que je proposais, il me semble : un tableau de structures.
0
lolofougere Messages postés 44 Date d'inscription samedi 21 février 2015 Statut Membre Dernière intervention 9 juillet 2021 21
23 févr. 2017 à 19:08
Merci
C'est pas vraiment un devoir, plus un projet.

Je ne connais que le language C c'est pour ca que je le fais en C.
Mon but c'est dans un premier temps de mettre mon CSV dans un tableau à 2 dimension --> Chaque chaine de caractère entre des ';' dans des cases et à chaque '/n' changer de ligne de mon tableau.
Tout ca pour l'afficher sachant que je ne veux afficher que quelques colonne.
Plus tard je reprendrais cette gestion pour modifier ou ajouter des lignes.
0
123guitare Messages postés 33 Date d'inscription mardi 24 mai 2016 Statut Membre Dernière intervention 30 décembre 2017 1
23 févr. 2017 à 14:41
Bonjour,
dans la bibliothèque standard tu as la fonction strtok qui peut faire l'affaire.


#include <string.h>
#include <stdio.h>

int main()
{
FILE *fichier_brut;
char cLigne_lue[256];
const char delimiteur[2] = ";";
char *token;

fichier_brut = fopen("strtok.c","r");

if(fichier_brut)
{
while (!feof(fichier_brut))
{
fgets(cLigne_lue, 256, fichier_brut);


token = strtok(cLigne_lue, delimiteur);
while( token != NULL )
{
printf( " %s\n", token );
token = strtok(NULL, cLigne_lue);
}

printf("%s",cLigne_lue);
}

fclose(fichier_brut);
}
else perror("erreur ouverture fichier\n");
return(0);
}
0
lolofougere Messages postés 44 Date d'inscription samedi 21 février 2015 Statut Membre Dernière intervention 9 juillet 2021 21
23 févr. 2017 à 19:09
Merci, je vais essayé ce morceau de code en l'adaptant au miens
0
lolofougere Messages postés 44 Date d'inscription samedi 21 février 2015 Statut Membre Dernière intervention 9 juillet 2021 21
23 févr. 2017 à 19:35
Ca fonctionne partiellement, mais j'ai une partie des caractère qui sont oublié
0
123guitare Messages postés 33 Date d'inscription mardi 24 mai 2016 Statut Membre Dernière intervention 30 décembre 2017 1 > lolofougere Messages postés 44 Date d'inscription samedi 21 février 2015 Statut Membre Dernière intervention 9 juillet 2021
24 févr. 2017 à 09:54
Bonjour,
C'est peut être un problème de codage des caractères. Il me semble que la bibliothèque standard travaille sur des caractères ASCII, et si ton fichier est en UNICODE ça peut poser des problèmes.
Il va peut être falloir que tu traites ton fichier en entrée avant de l'exploiter. Il doit bien y avoir une fonction qui fait ça: conversion UNICODE->ASCII sinon il faut la faire.
Regarde ici -> https://openclassrooms.com/courses/mettez-des-accents-dans-vos-programmes-avec-le-type-wchar-t
Autre solution, plus restrictive: imposer le codage du fichier en entrée.
0
123guitare Messages postés 33 Date d'inscription mardi 24 mai 2016 Statut Membre Dernière intervention 30 décembre 2017 1
23 févr. 2017 à 14:43
bien sûr il faut mette ton fichier en lecture (stock.c c'est pour mon test: je n'ai pas essayé avec un fichier csv).
0
lolofougere Messages postés 44 Date d'inscription samedi 21 février 2015 Statut Membre Dernière intervention 9 juillet 2021 21
21 mars 2017 à 21:38
Bonjour à tous, j'ai enchéné merde sur merde avec mon PC,

J'ai trouvé une solution a mon problème.

J'ai créer un tableau a deux dimension pour chaque colonne de mon fichier

Ainsi je stock chaque colonne dans un tableau que j'utilise dans l'ordre que je veux ensuite.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
123guitare Messages postés 33 Date d'inscription mardi 24 mai 2016 Statut Membre Dernière intervention 30 décembre 2017 1
5 avril 2017 à 12:08
C'est quand même pas une bonne idée de tout stocker en mémoire!
à terme cela te posera des problèmes. A mon humble avis c'est une erreur de conception.
Mais ça peut le faire. Il y a beaucoup de logiciels qui font le job tout en étant mal conçus.
0
lolofougere Messages postés 44 Date d'inscription samedi 21 février 2015 Statut Membre Dernière intervention 9 juillet 2021 21
19 avril 2017 à 22:09
Pour moi c'était le plus simple ..
Comme je dois faire des recherche, des ajout ou des motif j'entre la ligne à la quelle je veux travailler et je modifie ce que je veux.

A la fin je peu tout retranscrire dans un fichier.
0