/***************************************************************************** Welcome to GDB Online. GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl, C#, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog. Code, Compile, Run and Debug online from anywhere in world. *******************************************************************************/ #include #include #include #include #include size_t getFilesize (const char *filename) { struct stat st; stat (filename, &st); return st.st_size; } void parsedata (FILE ** fp2, char **buffer, char **outpbuff); static unsigned long intsize = 4194304; int main () { char *outbuff = malloc (intsize); char *buffer = malloc (intsize); buffer[intsize - 1] = '\0'; unsigned long cnt = 0; unsigned long seekoff = 0; unsigned long tiles = 0; unsigned long fsize = getFilesize ("list.txt"); FILE *fp = fopen ("list.txt", "rb"); FILE *fp2 = fopen ("nodup.txt", "w"); setvbuf (fp2, NULL, _IOFBF, intsize); while (fread (buffer, intsize - 1, 1, fp)) { cnt++; seekoff = ftell (fp); int nlpos = intsize - 1UL; while (buffer[nlpos] != '\n') { nlpos--; seekoff = seekoff - 1UL; } fseek (fp, seekoff, SEEK_SET); buffer[nlpos - 1] = '\0'; buffer[intsize] = '\0'; parsedata (&fp2, &buffer, &outbuff); tiles = ftell (fp); //fwrite(outbuff, intsize, 1, fp2); fprintf (fp2, outbuff); } unsigned long lastblock = fsize - tiles; buffer[lastblock - 1] = '\0'; fread (buffer, lastblock + 1, 1, fp); parsedata (&fp2, &buffer, &outbuff); fprintf (fp2, outbuff); fprintf (fp2, "%c", '\n'); fflush (fp2); fclose (fp); fclose (fp2); } void parsedata (FILE ** fp2, char **buffer, char **outpbuff) { *outpbuff[0] = 0; int felder = 45; int ignore = 3; char *cols[felder]; char *backup = NULL; int n = 0; unsigned long seps = 0; char *last = NULL; char *lastconcat = NULL; lastconcat = *outpbuff; int first = 1; for (char *p = strtok_r (*buffer, ";", &backup); p != NULL; p = strtok_r (NULL, ";", &backup)) { seps = p - last; if (first == 1) first = 0; else while (seps > 0) { seps--; cols[n++] = ""; lastconcat = stpcpy (lastconcat, ";"); //(*outpbuff, ";"); if (n > felder - 1) n = 0; } if (n <= ignore) { // printf("%s",p); lastconcat = stpcpy (lastconcat, p); lastconcat = stpcpy (lastconcat, ";"); } else if (n > ignore && n < felder + 1) { for (int x = n - 1; x >= ignore; x--) { if (strcmp (cols[x], p) == 0) break; else if (x <= ignore) lastconcat = stpcpy (lastconcat, p); } lastconcat = stpcpy (lastconcat, ";"); } if (n > felder - 1) n = 0; cols[n++] = p; last = backup; } while (n < felder) { lastconcat = stpcpy (lastconcat, ";"); n++; } }