Comment lire un fichier csv avec séparateur ; pour structure

Fermé
Rhamm94 Messages postés 11 Date d'inscription lundi 16 mars 2015 Statut Membre Dernière intervention 21 octobre 2015 - 16 mars 2015 à 13:19
Rhamm94 Messages postés 11 Date d'inscription lundi 16 mars 2015 Statut Membre Dernière intervention 21 octobre 2015 - 28 avril 2015 à 20:16
Bonjour,

Je souhaiterais savoir comment lire un fichier csv avec séparateur ";".

Car je voudrais renseigné une structure avec les informations lus dans un fichier.

ex :

nom;prenom;date_de_naissance;lieu_de_naissance;

Mais aussi prendre en compte les champs vide afin de ne pas perturber ma structure

ex :

nom;prenom;;lieu_de_naissance;


Mais aussi comment récupérer ces infos et renvoyer ces valeurs dans m structure ?

Merci pour votre aide.

4 réponses

Rhamm94 Messages postés 11 Date d'inscription lundi 16 mars 2015 Statut Membre Dernière intervention 21 octobre 2015
17 mars 2015 à 12:36
Ci dessous l'ébauche du code. (je ne voudrais pas qu'on pense que j'attend que quelqu'un fasse mon travail.)
Par contre j'ai vraiment besoin d'un coup de main.

Merci d'avance.

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

struct Adresse
{
char Societe[40];
int ClientSite;
int ClientCompta;
char Groupe[50];
char Fjuri[54];
char Nom[45];
char Enseigne[45];
char Adresse1[45];
char Adresse2[45];
int Cpost;
char Ville[45];
int Tel;
int Fax;
char Email[40];
int Siret;

};

int nbLignesAdresseClients(void);
char *dest;
char *fichier;


struct Adresse client[nbLignesAdresseClients] ;
Int nbClient ;

Char *membresAdresse[14] ;


char *fichierAdresseClient="Adresse clients.csv"; // NOUVEAU
char *copieFichierAdresseClient="Donnees/Adresse Clients.txt"; // ANCIEN


int main()
{
lireFichierAdresse;
montrer();
ecrireFichierAdresse;

return(0);
}

int compte(FILE *fichierLignes) /* compteur de lignes */
{
int c;
int nLignes = 0;
int c2 = '\0';

while((c=fgetc(fichierLignes)) != EOF)
{
if(c=='\n')
nLignes++;
c2 = c;
}

/* Ici, c2 est égal au caractère juste avant le EOF. */

if(c2 != '\n')nLignes++; /* Dernière ligne non finie */

return nLignes;
}

int nbLignesAdresseClients(void) /*Compteur lignes fichier Adresse Clients */
{
FILE *fichierLignes = fopen(fichierAdresseClient, "r");
if(fichierAdresse != NULL)
{
int nLignes = compte(fichierLignes);

printf("Nombre de lignes : %d\n", nLignes);

fclose(fichierLignes);
}
else
puts("Erreur en ouverture du fichier : Adresses Clients.");
return 0;
}


void lireFichierAdresse(void)
{
FILE *f;
struct Adresse charge;
f = fopen(fichierAdresseClients, "r");
if(!f) /* Fichier introuvable !*/
return;
/* Lecture totale */
while(fread(&client, sizeof(client), 1, f))
{
void lectureChampsAdresse (f);

/* Lecture des valeurs du fichier, */
client.Societe=charge.Societe;
client.ClientSite=charge.ClientSite;
client.ClientCompta=charge.ClientCompta;
client.Groupe=charge.Groupe;
client.Fjuri=charge.Fjuri;
client.Nom=charge.Nom;
client.Enseigne=charge.Enseigne;
client.Adresse1=charge.Adresse1;
client.Adresse2=charge.Adresse2;
client.Cpost=charge.Cpost;
client.Ville=charge.Ville;
client.Tel=charge.Tel;
client.Fax=charge.Fax;
client.Email=charge.Email;
client.Siret=charge.Siret;

/* pas des pointeurs ! */


}
fclose(f);
}

void ecrireFichierAdresse(void)
{
FILE *f;
if(client == NULL) /* Liste vide */
{
puts("Rien a sauvegarder !");
return;
}

f = fopen(copieFichierAdresseClient, "w");
if(!f)
{
puts("Erreur en ouverture de fichier");
exit(1);
}
while(client) /* Dernier enreg == NULL */
{
fwrite(&client, sizeof(client), 1, f);
}
fclose(f);
} ;

/* Affiche tous les enregistrements de la liste */
void montrer(void)
{
if(client == NULL) /* Liste vide */
{
puts("Rien a afficher");
return;
}
puts("Affichage complet :");
while(client) /* Dernier == NULL */
{
printf("%s\n",client.Societe);
printf("%d\n",client.ClientSite);
printf("%d\n",client.ClientCompta);
printf("%s\n",client.Groupe);
printf("%s\n",client.Fjuri);
printf("%s\n",client.Nom);
printf("%s\n",client.Enseigne);
printf("%s\n",client.Adresse1);
printf("%s\n",client.Adresse2);
printf("%s\n",client.Cpost);
printf("%s\n",client.Ville);
printf("%d\n",client.Tel);
printf("%d\n",client.Fax);
printf("%s\n",client.Email);
printf("%d\n",client.Siret);
}
} ;

void lectureChampsAdresse (char* dest, File* fichierLu) //lecture d'un champ
{
int i=0
int a=0
Adresse charge;
Char site [20] = {0};
Char comptable [20] = {0};
Char cp [5] = {0};

while (a < 14)
{
c=fgetc(fichierLu) ; // on lit le caractere
if (c !=EOF && c!= `;')dest[i]=c; //si le caractere est valide
i++; // on passe au caractere suivant
membresAdresse[a] = dest //on enregistre la valeur dans un tableau de char
a++ ;

}

Site = membresAdresse[1] ;
Comptable = membresAdresse[2];
Cp = membresAdresse[9];


if (site, 20)
{
// Si lecture du texte ok, convertir le nombre en long et
le retourner
return strtol(site, NULL, 10);
}
else
{
// Si problème de lecture, renvoyer 0
return 0;
}

membresAdresse[1] = site ;

if (comptable, 20)
{
// Si lecture du texte ok, convertir le nombre en long et
le retourner
return strtol(comptable, NULL, 10);
}
else
{
// Si problème de lecture, renvoyer 0
return 0;
}


membresAdresse[2] = comptable ;

if (cp, 20)
{
// Si lecture du texte ok, convertir le nombre en long et
le retourner
return strtol(cp, NULL, 10);
}
else
{
// Si problème de lecture, renvoyer 0
return 0;
}

membresAdresse[9] = cp ;


charge.Societe = membresAdresse[0];
charge.ClientSite = membresAdresse[1];
charge.ClientCompta = membresAdresse[2];
charge.Groupe = membresAdresse[3];
charge.Fjuri = membresAdresse[4];
charge.Nom = membresAdresse[5];
charge.Enseigne = membresAdresse[6];
charge.Adresse1 = membresAdresse[7];
charge.Adresse2 = membresAdresse[8];
charge.Cpost = membresAdresse[9];
charge.Ville = membresAdresse[10];
charge.Tel = membresAdresse[11];
charge.Fax = membresAdresse[12];
charge.Email = membresAdresse[13];
charge.Siret = membresAdresse[14];



While (c!=EOF && c != ` ;') ; //fin de lecture
Dest [i] = `\0'; //fin de chaine
}

0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié par [Dal] le 26/03/2015 à 16:00
Je n'ai pas regardé en détails ton code, mais j'ai tenté de le compiler.

Tu as écrit un code de 261 lignes qui ne compile pas dès la 30ème ligne et qui renvoie 65 lignes d'erreurs et avertissements.

Ce n'est pas comme cela qu'on crée un programme. Dès que tu as écris quelques lignes, compile et teste. Dès que tu as écris quoi que ce soit de fonctionnel, compile, teste et vérifies en le fonctionnement. Tu n'attends d'avoir écrit pas loin de 300 lignes, pour ne pas savoir quoi en faire et le balancer sur un forum.

Ton code, qui ne compile pas, n'illustre pas ta question car il n'est pas limité à ta question (en fait les très nombreuses erreurs montrent que tu devrais te poser plein d'autres questions et les résoudre avant d'en arriver à celle que tu poses).

Ta question est, en résumé, comment faire en C pour séparer les champs d'une ligne de texte séparés par des ;

Une réponse est : tu peux te servir de strtok pour le faire : http://www.cplusplus.com/reference/cstring/strtok/

Pour lire des lignes de texte dans un fichier texte, j'utiliserais fgets, pas fread.

Je ne comprends pas ce que tu veux tester en écrivant des tests tels que
if (site, 20)
, tu as des ` au lieu de ' pour délimiter un caractère, tu appelles une fonction
lireFichierAdresse()
dans main en omettant d'utiliser des parenthèses, tu mets des majuscules aux types, tu crées une fonction
nbLignesAdresseClients()
mais tu ne t'en sert pas dans ton code mais dans une déclaration de tableau (de nouveau sans parenthèses, mais que tu les mettes ou pas ce n'est pas la bonne façon de procéder), etc., etc.

Si tu dois stocker les éléments dans une structure, tu as besoin d'un tableau de structures, ou d'une liste chaînée de structures, vu que tu as plus d'une ligne à charger en mémoire. Si tu veux faire un tableau, comme tu sembles vouloir le faire, soit tu fais un tableau de taille statique avec une taille maximale, soit tu déclares un pointeur sur la structure et tu alloues avec malloc suffisamment de mémoire pour le nombre de structures à stocker.

Tu peux alors te servir de
nbLignesAdresseClients()
pour déterminer au préalable la mémoire dynamique nécessaire à partir du nombre de lignes (et donc de structures à stocker).

Dal
0