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
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
A voir également:
- Nombre de colonnes invalides dans les données csv à la ligne 1.
- Aller à la ligne excel - Guide
- Chaque fichier en ligne sur le web a un chemin d’accès sur un serveur. c’est le cas du fichier du logo présent sur la page de cette ville. quel est le chemin de ce fichier à partir de la racine du site ? - Forum Graphisme
- Site de vente en ligne particulier - Guide
- Les données fournies dans le fichier à télécharger peuvent être synthétisées par le tableau récapitulatif suivant. dans le fichier, générez ce tableau automatiquement (tableau croisé dynamique ou table de pilote) à partir des 4 premières colonnes. cinq valeurs manquent dans le tableau suivant. retrouvez-les dans votre tableau puis reportez-les, arrondies à l’entier le plus proche, dans la zone de réponse. ✓ - Forum Jeux vidéo
- Partage de photos en ligne - Guide
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
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.
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
}
Modifié par [Dal] le 26/03/2015 à 16:00
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 , tu as des ` au lieu de ' pour délimiter un caractère, tu appelles une fonction dans main en omettant d'utiliser des parenthèses, tu mets des majuscules aux types, tu crées une fonction 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 pour déterminer au préalable la mémoire dynamique nécessaire à partir du nombre de lignes (et donc de structures à stocker).
Dal