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 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
| #include <math.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
int decoder(char* fichier, char* scolname, int marge, int deltaOnOff, int cptDebutAnalyse)
{
FILE* fIN;
char ligne[256]; //les csv utilisés n'ont jamais de lignes de plus de 50 caractères.. alors 256 caractères offrent une bonne marge
int cpt=0,
nbCol=0,
colCible,
itok,
nbcarac,
nbLignes;
int* ievent;
char** token;
time_t tps;
char* tampon = (char*)malloc(100*sizeof(char));
unsigned int *uidate,
*uipower;
struct tm date_struct;
// fread(void *buffer; size_t tailleBloc, size_t nombreBlocs, FILE *flot);
fIN = fopen(fichier, "r");
if(fIN == NULL)
{
return EXIT_FAILURE;
}
//lecture de la première ligne du fichier :
if(fgets(ligne, sizeof ligne, fIN)==NULL)
{//le fichier csv d'entrée est vide
return EXIT_FAILURE;
}
//parcours de la première ligne pour séparer les différents noms de colones (séparés par des ';' )
while(ligne[cpt]!='\0')
{
if(ligne[cpt]== ';')
nbCol++;
cpt++;
}
//réservation d'une zone mémoire pour garder les différents token (noms de colonnes)
token = (char**)malloc(nbCol*sizeof(char*));
if(token==NULL)
return EXIT_FAILURE;
//extraction des noms de colonnes
cpt = 0;
itok=0;
nbcarac=0;
while(ligne[cpt]!='\0')
{
if(ligne[cpt]==';')
{
tampon[nbcarac++]='\0';//ajouter le caractere \0 en fin de chaine dans tampon.
token[itok] = (char*)malloc(nbcarac*sizeof(char));
if(token[itok]==NULL)
return EXIT_FAILURE;
strcpy(token[itok++], tampon);
nbcarac = 0;
cpt++;
}
else
{
tampon[nbcarac++]=ligne[cpt++];
}
}
//recherche de la colonne à analyser (celle appelée scolname)
for(cpt=0; cpt<itok; cpt++)
{
if(strcmp(token[cpt], "scolname")==0)
{
colCible = cpt;
break;
}
}
/** A ce stade on sait que : Col 0 = date ; Col 1 = W ; Col 2 = interval ; Col colCible = courbe d'évenements **/
//mise en mémoire des données : Date, W, et courbe d'évenements
//parcourt du fichier entier pour savoir combien il y a de lignes (pour l'allocation mémoire)
nbLignes=0;
while(fgets(ligne, sizeof ligne, fIN)!=NULL)
nbLignes++;
//allocation mémoire pour les tableaux de données
uidate = (unsigned int*)malloc(nbLignes*sizeof(unsigned int));
uipower = (unsigned int*)malloc(nbLignes*sizeof(unsigned int));
ievent = (int*)malloc(nbLignes*sizeof(int));
fclose(fIN); //besoin de retourner au début du fichier. pas trouvé la fonction qui le fait, alors je ferme et je réouvre le fichier.
fIN = fopen(fichier, "r");
if(fIN == NULL)
{
return EXIT_FAILURE;
}
fgets(ligne, sizeof(ligne), fIN); //permet de sauter la première ligne, deja traitée
fgets(ligne, sizeof(ligne), fIN); //on traite la deuxième ligne à part, car c'est sur celle ci qu'on va lire et interpreter la date.
cpt = 0;
nbcarac = 0;
//lecture de l'année:
while(ligne[cpt]!='-')
{
tampon[nbcarac++]=ligne[cpt++];
}
tampon[nbcarac]='\0';
date_struct.tm_year = atoi(tampon)-1900;
cpt++;
nbcarac = 0;
//lecture du mois
while(ligne[cpt]!='-')
{
tampon[nbcarac++]=ligne[cpt++];
}
tampon[nbcarac]='\0';
date_struct.tm_mon = atoi(tampon)-1;
cpt++;
nbcarac = 0;
//lecture du jour
while(ligne[cpt]!=' ')
{
tampon[nbcarac++]=ligne[cpt++];
}
tampon[nbcarac]='\0';
date_struct.tm_mday = atoi(tampon);
cpt++;
nbcarac = 0;
//lecture de l'heure
while(ligne[cpt]!=':')
{
tampon[nbcarac++]=ligne[cpt++];
}
tampon[nbcarac]='\0';
date_struct.tm_hour = atoi(tampon);
cpt++;
nbcarac = 0;
//lecture des minutes
while(ligne[cpt]!=':')
{
tampon[nbcarac++]=ligne[cpt++];
}
tampon[nbcarac]='\0';
date_struct.tm_min = atoi(tampon);
cpt++;
nbcarac = 0;
//lecture des secondes
while(ligne[cpt]!=';')
{
tampon[nbcarac++]=ligne[cpt++];
}
tampon[nbcarac]='\0';
date_struct.tm_sec = atoi(tampon);
cpt++;
nbcarac = 0;
//conversion en time_t
tps = mktime(&date_struct);
printf("temps lu : %d\nce qui correspond à la date du :\n%s\n", tps, ctime(&tps));
fclose(fIN);
return 0;
}
int fonction_test() {
struct tm t;
time_t tps;
int jour, mois, an;
printf("Jour : "); scanf("%d", &jour);
printf("Mois : "); scanf("%d", &mois);
printf("Annee: "); scanf("%d", &an);
t.tm_year = an - 1900;
t.tm_mon = mois - 1;
t.tm_mday = jour;
t.tm_hour = t.tm_min = t.tm_sec = 0;
tps = mktime(&t);
printf("\ntps = %d\n", tps);
printf("Date et heure: %s\n", ctime(&tps));
return 0;
}
int main()
{
decoder("F:\\donnees R&D_tmp\\741-(cpt_elec)\\2005-09-02-R10000441-M00000741[N200].csv","W",30,20,200);
fonction_test();
return 0;
} |
Partager