#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_t
getFilesize (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 = 2048000;
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;
int
main (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;
void
checkdate (char **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);
if (check == NULL || *check != '\0')
{}else{
if(count>2){
//strftime (&temp, 21, "%Y", &tm);
char *temp;
int tempyear=tm.tm_year+1900;
//printf("%d %s \n",tempyear, temp);
sprintf (temp, "%d",tempyear);
//printf("%d %s \n",tempyear, temp);
if(strcmp (temp,jahr) != 0)
skip=0; else skip=1;
}
if(count>3){
//strftime (&temp, 21, "%Y", &tm);
char *temps;
int tempmon=tm.tm_mon;
//printf("%d %s \n",tempmon, temps);
sprintf (temps, "%d",tempmon+1);
//printf("%s %s \n",monat, temps);
if(strcmp (temps,monat) != 0)
skip=0; else skip=1;
}
}
}
void
parsedata (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;
for (p = strtok_r (*buffer, ",", &backup); p != NULL;
p = strtok_r (NULL, ",", &backup))
{
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)
{lastconcat = stpcpy (lastconcat, ",");
lastconcat = stpcpy (lastconcat, *Kammer);
lastconcat = stpcpy (lastconcat, ",");
lastconcat = stpcpy (lastconcat, *Vorgang);
}
//checkdate (&p);
}
if (usedcols[n] != 0 &&skip==1)
{
if (first != 1)
lastconcat = stpcpy (lastconcat, ",");
first = 0;
lastconcat = stpcpy (lastconcat, p);
}
n++;
}
}
Comments