1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
//truc.c
#include<stdio.h>
#include <stdlib.h>
typedef struct {
int n1;
long int n2; // peut aller jusque 200000
int n3;
int n4;
int n5;
int n6;
int n7;
int n8;
int n9;
int n10;
int n11;
int n12;
int n13;
int n14; //peut etre NA dans le csv :s ce serait pour ça que ça ne fonctionne pas? (entre autres)
int n15; //peut etre NA dans le csv
int n16; //peut etre NA dans le csv
int n17;
int n18; //booleen
int n19;
int n20;
} maStructure;
//prototype
maStructure * parser(char filename);
/**
* read the csv file and load it in a C table
* IN: filename
* OUT: data which contains all the lines of the csv file in "maStructure" format
**/
maStructure * parser(char filename){
FILE* file = NULL; //fichier vide
char buffer[BUFSIZ]; //tableau tampon de taille n =>ma principale source d'erreur lorsque je compile: je ne vois pas trop quoi lui donner comme taille: chaque ligne peut avoir une taille différente... Je ne sais pas trop comment fabriquer mon buffer pour la suite en fait... :s
int i = 0;
file = fopen(filename, "r+");
if (file==NULL) {
printf("cannot open file %s\n", filename);
exit(1);
}
//attribution de l'espace pour les donnees en memoire
maStructure data = malloc(sizeof(maStructure)*nfile);
printf("loading %s\n", filename);
fgets(buffer, bufsiz, file); // pour lire la ligne header du csv
//tant qu'il existe des lignes à lire
while (fgets(buffer, sizeof(buffer), file)){
//on stock chaque element de la ligne dans la colonne de data correspondante ==> problème pour le traitement des NA?
sscanf(buffer, "%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d",
&data[i].n1;
&data[i].n2;
&data[i].n3;
&data[i].n4;
&data[i].n5;
&data[i].n6;
&data[i].n7;
&data[i].n8;
&data[i].n9;
&data[i].n10;
&data[i].n11;
&data[i].n12;
&data[i].n13;
&data[i].n14;
&data[i].n15;
&data[i].n16;
&data[i].n17);
&data[i].n18=NULL;
&data[i].n19=NULL;
&data[i].n20=NULL;
#if (DEBUG > 1)
printf("%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d,%d,%d, %d, %d, %d, %d, %d",
data[i].n1;
data[i].n2;
data[i].n3;
data[i].n4;
data[i].n5;
data[i].n6;
data[i].n7;
data[i].n8;
data[i].n9;
data[i].n10;
data[i].n11;
data[i].n12;
data[i].n13;
data[i].n14;
data[i].n15;
data[i].n16;
data[i].n17);
#endif
i++;
}
/**
// while ((c = fgetc (file)) != EOF) {
// if (c == ';' || c == '\n') {
// printf ("%ld\n", strtol (buffer, NULL, 10));
// i = 0;
// memset (buffer, 0, sizeof buffer);
// } else {
// buffer[i++] = c;
// }
// }
**/
fclose (file);
return(&data);
}
int main(int argc, char *argv[]) {
global int nfile = 27; //mauvaise idée de le mettre en globale?
maStructure * a = parser(*argv[0]);
return(a);
} |