#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/stat.h>#include <sys/types.h>#include <regex.h>#define __USE_XOPEN#include <time.h> #define felder 56 #ifdef _WIN32#define strtok_r strtok_s__inline char *stpcpy (char *a, const char *b){ size_t n, m; n = strlen (a); m = strlen (b); a += n; memcpy (a, b, m + 1); return a + m;}#endif size_tgetFilesize (const char *filename){ struct stat st; stat (filename, &st); return st.st_size;} void parsedata (char **buffer, char **outpbuff, char **Kammer, char **Vorgang);static char *jahr ;static char *monat ;static int skip = 0 ;static int first = 0;static unsigned long intsize = 20480000;static unsigned int usedcols[58] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};static int count = 0;intmain (int argc, char *argv[]){//int count = 0; while(argv[++count] != NULL){} int usedcolsinit[12] = { 1, 2, 9, 13, 14, 15, 20, 23, 24, 25, 26, 27 }; for (int i = 0; i < 11; i++) usedcols[usedcolsinit[i] - 1] = 1; char *outbuff = malloc (intsize); char *buffer = malloc (intsize); char *filename = argv[1];if(count >2) jahr =argv[2];if(count >3) monat=argv[3]; unsigned long cnt = 0; unsigned long seekoff = 0; unsigned long tiles = 0; unsigned long fsize = (int) getFilesize (argv[1]); FILE *fp = fopen (argv[1], "rb"); FILE *fp2 = fopen ("courbesall.txt", "a"); char *filetmp= filename; char *token = strtok (filetmp, "_"); char *Kammer = strtok (NULL, "_"); char *Vorgang = strtok (NULL, "_"); while(*Vorgang=='0') Vorgang++; // printf ("%s-%s-%s\n", token, Kammer, Vorgang); unsigned long lastblock; int nlpos; buffer[intsize - 1] = '\0'; setvbuf (fp2, NULL, _IOFBF, intsize); while (fread (buffer, intsize - 1, 1, fp)) { cnt++; seekoff = ftell (fp); nlpos = intsize - 1UL; while (buffer[nlpos] != '\n') { nlpos--; seekoff = seekoff - 1UL; } fseek (fp, seekoff, SEEK_SET); buffer[nlpos - 1] = '\0'; buffer[intsize] = '\0'; parsedata (&buffer, &outbuff, &Kammer, &Vorgang); tiles = ftell (fp); fprintf (fp2, "%s", outbuff); } lastblock = fsize - tiles; buffer[lastblock - 1] = '\0'; fread (buffer, lastblock + 1, 1, fp); parsedata (&buffer, &outbuff, &Kammer, &Vorgang); fprintf (fp2, "%s", outbuff); fprintf (fp2, "%c", '\n'); fflush (fp2); fclose (fp); fclose (fp2);} static int firstnl = 1;voidcheckdate (char **tmps){//printf("First:%s",*tmps); struct tm tm; char *tmp; tmp = tmps[0]; if (firstnl != 1) tmp++; firstnl = 0; memset (&tm, 0, sizeof (tm)); char *check = malloc (80); check[0] = '\0'; if (tmp[0] == '\n') { tmp++; } if (tmp[0] == '\n') check = strptime (tmp, "\n%d/%m/%Y %H:%M:%S", &tm); else check = strptime (tmp, "%d/%m/%Y %H:%M:%S", &tm); if (check == NULL || *check != '\0') { if (tmp[0] == '\n') check = strptime (tmp, "\n%Y/%m/%d %H:%M:%S", &tm); else check = strptime (tmp, "%Y/%m/%d %H:%M:%S", &tm); if (check == NULL || *check != '\0') { } else if (tmp[0] == '\n') strftime (tmp, 21, "\n%d-%m-%Y %H:%M:%S", &tm); else strftime (tmp, 21, "%d-%m-%Y %H:%M:%S", &tm); } else if (tmp[0] == '\n') strftime (tmp, 21, "\n%d-%m-%Y %H:%M:%S", &tm); else strftime (tmp, 21, "%d-%m-%Y %H:%M:%S", &tm); if (tmp[0] == '\n') check = strptime (tmp, "\n%d-%m-%Y %H:%M:%S", &tm); else check = strptime (tmp, "%d-%m-%Y %H:%M:%S", &tm);//printf("firstafter:%s",tmp); if (check == NULL || *check != '\0') {printf("NL ErrorCheckdate\n");//printf("%s %s",tmp,check);}else{//printf("firstafter:%s",tmp);if(count>2){char tempsss[20];int tempyear=tm.tm_year+1900;sprintf (tempsss, "%d",tempyear);if(strcmp (tempsss,jahr) != 0){skip=0;//printf("",tempsss,jahr);} else skip=1;}//printf("aftermonth:%s",tmp);if(count>3){char tempss[20];int tempmon=tm.tm_mon;sprintf (tempss, "%d",tempmon+1);//printf("aftersprintf:%s",tmp);if(strcmp (tempss,monat) != 0)skip=0; else skip=1;}}//printf("secondafter:%s",tmp);} voidparsedata (char **buffer, char **outpbuff, char **Kammer, char **Vorgang){ int ignore = 3; char *backup = NULL; int n = 0; size_t seps = 0; char *last = NULL; char *lastconcat = NULL; char *p; int x; int first = 1; *outpbuff[0] = 0; lastconcat = *outpbuff; int firstnl = 1; lastconcat = stpcpy (lastconcat, "start"); p = strtok_r (*buffer, ",", &backup); p = *buffer;//if(*buffer[0]!='\n')while ( p != NULL ) if(p[0]!="\n") {//printf("%d-%s|",n, p); //if(n==0&&p[0]!='\n'&&first!=1){//printf("NL Error:%s\n",p); if (n == felder) { n = 0; } if (n == 0) { checkdate (&p); if (first != 1 &&skip==1) { //printf("NULLZEILE",p);// lastconcat = stpcpy (lastconcat, "|"); lastconcat = stpcpy (lastconcat, ","); lastconcat = stpcpy (lastconcat, *Kammer); lastconcat = stpcpy (lastconcat, ","); lastconcat = stpcpy (lastconcat, *Vorgang);// lastconcat = stpcpy (lastconcat, "|"); } //checkdate (&p); } if ((usedcols[n] != 0) && skip==1) { if (first != 1) { lastconcat = stpcpy (lastconcat, ","); } first = 0; lastconcat = stpcpy (lastconcat, p); } n++; p = strtok_r (NULL, ",", &backup); } lastconcat = stpcpy (lastconcat, ","); lastconcat = stpcpy (lastconcat, *Kammer); lastconcat = stpcpy (lastconcat, ","); lastconcat = stpcpy (lastconcat, *Vorgang); lastconcat = stpcpy (lastconcat, "Ende");}
Comments