csv_reader_V2.c 5.89 KB
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>

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;


void affiche_header_top50()
{
    printf("Index nom prenom score");
}

void affiche_header_recherche()
{
    printf("athId nom prenom gender age taille poids score18.1 score18.2 score 18.2a score18.3 score18.4 score18.5");
}

void affiche_top50(Personne P, int i)
{
    printf("%d %s %s %d", i , P.lastName, P.firstName, P.overallScrore);
}

void affiche_recherche(Personne P)
{
    printf("%d %s %s %c %d %s %s %d %d %d %d %d %d", P.athId, P.lastName, P.firstName, P.gender, P.age, P.height, P.weight, P.score18_1, P.score18_2, P.score18_2a, P.score18_3, P.score18_4, P.score18_5);
}

// Conditionals
const bool          IS_DEBUG            = false;

// 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 ajout_personne_tab(Personne P, char* token)
{
    
    
    
}


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);
    
    Personne P[10];
    unsigned int    i = 0;

    // Remaining rows are the entries
    while ( NULL != fgets(buffer, BUFFER_SIZE, fp) )
    {
        // strtok init.
        P[i].athId = atoi(strtok(buffer, CSV_DELIMITERS));
        P[i].regId = atoi(strtok(NULL, CSV_DELIMITERS));
        P[i].divId = atoi(strtok(NULL, CSV_DELIMITERS));
        P[i].lastName = strtok(NULL, CSV_DELIMITERS);
        P[i].firstName = strtok(buffer, CSV_DELIMITERS);
        P[i].gender = *strtok(buffer, CSV_DELIMITERS);
        P[i].age = atoi(strtok(buffer, CSV_DELIMITERS));
        P[i].weight = strtok(buffer, CSV_DELIMITERS);
        P[i].height  = strtok(buffer, CSV_DELIMITERS);
        P[i].affiliateId = atoi(strtok(buffer, CSV_DELIMITERS));
        P[i].affiliateName = strtok(buffer, CSV_DELIMITERS);
        P[i].overallScrore = atoi(strtok(buffer, CSV_DELIMITERS));
        P[i].overallRank = atoi(strtok(buffer, CSV_DELIMITERS));
        P[i].score18_1 = atoi(strtok(buffer, CSV_DELIMITERS));
        P[i].scoreDisplay18_1 = strtok(buffer, CSV_DELIMITERS);
        P[i].rank18_1 = atoi(strtok(buffer, CSV_DELIMITERS));
        P[i].score18_2 = atoi(strtok(buffer, CSV_DELIMITERS));
        P[i].score18_2a = atoi(strtok(buffer, CSV_DELIMITERS));
        P[i].scoreDisplay18_2a = strtok(buffer, CSV_DELIMITERS);
        P[i].rank18_2a = atoi(strtok(buffer, CSV_DELIMITERS));
        P[i].score18_3 = atoi(strtok(buffer, CSV_DELIMITERS));
        P[i].scoreDisplay18_3 = strtok(buffer, CSV_DELIMITERS);
        P[i].rank18_3 = atoi(strtok(buffer, CSV_DELIMITERS));
        P[i].score18_4 = atoi(strtok(buffer, CSV_DELIMITERS));
        P[i].scoreDisplay18_4 = strtok(buffer, CSV_DELIMITERS);
        P[i].rank18_4 = atoi(strtok(buffer, CSV_DELIMITERS));
        P[i].score18_5 = atoi(strtok(buffer, CSV_DELIMITERS));
        P[i].scoreDisplay18_5 = strtok(buffer, CSV_DELIMITERS);
        P[i].rank18_5 = atoi(strtok(buffer, CSV_DELIMITERS));
        
        i++;
    }

    printf("%d ", P[2].regId);
    
    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;
}