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 -
lolofougere Messages postés 44 Date d'inscription Statut Membre Dernière intervention -
A voir également:
- Strtok csv
- Format spbm ou csv - Forum Mobile
- Logiciel csv gratuit - Télécharger - Bases de données
- Ouviri fichier extension .spb ✓ - Forum Logiciels
- Advanced csv converter - Télécharger - Gestion de données
- Nombre de colonnes invalides dans les données csv à la ligne 1 - Forum MySQL
5 réponses
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
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
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);
}
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);
}
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.
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.
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).
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
à 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.
Une dimension pour les colonnes et une autre dimension pour les lignes.
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
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.