String-char Traitement fichier CSV

Résolu
lolofougere Messages postés 44 Date d'inscription   Statut Membre Dernière intervention   -  
lolofougere Messages postés 44 Date d'inscription   Statut Membre Dernière intervention   -
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

5 réponses

[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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   Statut Membre Dernière intervention   3
 
Un tableau à 2 dimensions est suffisant
Une dimension pour les colonnes et une autre dimension pour les lignes.
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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   Statut Membre Dernière intervention   3 > [Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention  
 
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 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
C'est ce que je proposais, il me semble : un tableau de structures.
0
lolofougere Messages postés 44 Date d'inscription   Statut Membre Dernière intervention   21
 
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   Statut Membre Dernière intervention   1
 
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   Statut Membre Dernière intervention   21
 
Merci, je vais essayé ce morceau de code en l'adaptant au miens
0
lolofougere Messages postés 44 Date d'inscription   Statut Membre Dernière intervention   21
 
Ca fonctionne partiellement, mais j'ai une partie des caractère qui sont oublié
0
123guitare Messages postés 33 Date d'inscription   Statut Membre Dernière intervention   1 > lolofougere Messages postés 44 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   1
 
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   Statut Membre Dernière intervention   21
 
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   Statut Membre Dernière intervention   1
 
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   Statut Membre Dernière intervention   21
 
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