diff --git a/src/csv_reader_V2.c b/src/csv_reader_V2.c new file mode 100644 index 0000000..61dfa86 --- /dev/null +++ b/src/csv_reader_V2.c @@ -0,0 +1,153 @@ +#include +#include +#include +#include + +typedef struct Personne Personne; +struct Personne {int athId; int regId; int divId; char* lastName; char* firstName; char gender; int age; char* weight; char* height; int affiliateId; char* affiliateName; int overallScrore; int overallRank; int score18_1; char* scoreDisplay18_1; int rank18_1; int score18_2; char* scoreDisplay18_2; int rank18_2;int score18_2a; char* scoreDisplay18_2a; int rank18_2a;int score18_3; char* scoreDisplay18_3; int rank18_3;int score18_4; char* scoreDisplay18_4; int rank18_4;int score18_5; char* scoreDisplay18_5; int rank18_5; Personne* suivant}; +typedef Personne* Liste; + + +affiche_header_top50() +{ + printf("Index nom prenom score"); +} + +affiche_header_recherche() +{ + printf("athId nom prenom gender age taille poids score18.1 score18.2 score 18.2a score18.3 score18.4 score18.5"); +} + +affiche_top50(Personne P, int i) +{ + printf("%d %s %s %d", i , P.lastName, P.firstName, P.score); +} + +affiche_recherche(Personne P) +{ + printf("%d %s %s %c %d %s %s %", P.athId, P.lastName, P.firstName, P.gender, P.age, P.height, P.weight, P.); +} + +// Conditionals +const bool IS_DEBUG = true; + +// Constants +const unsigned int BUFFER_SIZE = 2048; +const unsigned int FIELD_SIZE = 20; +const char CSV_DELIMITERS[] = ","; + +// Globals +char** CSV_HEADER_FIELDS; +unsigned int CSV_NB_FIELDS; + +void display_header() +{ + for(unsigned int i = 0; i < CSV_NB_FIELDS; i++) + { + printf("%d - %s\n", i, CSV_HEADER_FIELDS[i]); + } +} + +void read_csv_header(char * header_line) +{ + int line_length = strlen(header_line); + int nb_fields = 0; + char* string_ptr = header_line; + + // Count the occurrences of delimiters + while (NULL != string_ptr) + { + nb_fields++; + string_ptr = strpbrk(string_ptr, CSV_DELIMITERS); + if (NULL != string_ptr) + { + string_ptr++; + } + } + + // Globals allocation + CSV_NB_FIELDS = nb_fields; + CSV_HEADER_FIELDS = malloc( nb_fields * sizeof(char*) ); + + char* token = strtok(header_line, CSV_DELIMITERS); // strtok init. + + + + // Re-read the line to get the header of the columns + for (unsigned int i = 0; i < nb_fields; i++) + { + CSV_HEADER_FIELDS[i] = malloc( FIELD_SIZE * sizeof(char) ); // alloc + memset(CSV_HEADER_FIELDS[i], 0, FIELD_SIZE); // 0 init. + strcpy(CSV_HEADER_FIELDS[i], token); // copy field in the structure + token = strtok(NULL, CSV_DELIMITERS); // loop to get a new field label + // printf("%s ", *token); + } + + if (IS_DEBUG) display_header(); +} + +void read_csv_file(const char * filename) +{ + FILE* fp = fopen(filename, "r"); + char buffer[BUFFER_SIZE]; + + // Check if the file is really opened + if (NULL == fp) + { + fprintf(stderr, "Unable to open file: %s\n", filename); + return; + } + + // 1st row is a header with field descriptions + fgets(buffer, BUFFER_SIZE, fp); + read_csv_header(buffer); + + // Remaining rows are the entries + while ( NULL != fgets(buffer, BUFFER_SIZE, fp) ) + { + char* token; + unsigned int i = 0; + + // strtok init. + token = strtok(buffer, CSV_DELIMITERS); + + while (NULL != token) + { + if (IS_DEBUG) printf("Field %d is %s\n", i++, token); + + // ... + // you can strcpy the `token` string in your data structures + // ... + + token = strtok(NULL, CSV_DELIMITERS); + } + } + + fclose(fp); +} + +void usage(const char * prog_name) +{ + printf("Usage is %s your_csv_file\n\n", prog_name); +} + +int main(int argc, char * argv[]) +{ + + printf("test \n"); + if (2 != argc) + { + usage(argv[0]); + return 0; + } + + read_csv_file(argv[1]); + + for(unsigned int i = 0; i < CSV_NB_FIELDS; i++) + { + free(CSV_HEADER_FIELDS[i]); + } + free(CSV_HEADER_FIELDS); + + return 0; +} -- libgit2 0.21.2