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
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
A voir également:
- Strtok csv
- Convertir vcf en csv - Télécharger - Gestion de données
- Csv converter - Télécharger - Bases de données
- Ouvrir un fichier csv trop volumineux ✓ - Forum Excel
- Csv to pst - Forum Bureautique
- Convertir csv en ofx - Forum Excel
5 réponses
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
Modifié par [Dal] le 23/02/2017 à 14:18
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
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
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
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);
}
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);
}
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
23 févr. 2017 à 19:09
Merci, je vais essayé ce morceau de code en l'adaptant au miens
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
23 févr. 2017 à 19:35
Ca fonctionne partiellement, mais j'ai une partie des caractère qui sont oublié
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
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.
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.
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
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).
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
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.
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
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
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.
à 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.
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
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.
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.
23 févr. 2017 à 16:17
Une dimension pour les colonnes et une autre dimension pour les lignes.
23 févr. 2017 à 16:45
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
23 févr. 2017 à 16:56
23 févr. 2017 à 17:04
23 févr. 2017 à 19:08
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.