#include #include #include #include #include #define felder 45 #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); static unsigned long intsize = 4194304; int main() { char *outbuff = malloc(intsize); char *buffer = malloc(intsize); unsigned long cnt = 0; unsigned long seekoff = 0; unsigned long tiles = 0; unsigned long fsize = (int)getFilesize("list.txt"); FILE *fp = fopen("list.txt", "rb"); FILE *fp2 = fopen("nodup.txt", "w"); 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); tiles = ftell(fp); //fwrite(outbuff, intsize, 1, fp2); fprintf(fp2, outbuff); } lastblock = fsize - tiles; buffer[lastblock - 1] = '\0'; fread(buffer, lastblock + 1, 1, fp); parsedata(&buffer, &outbuff); fprintf(fp2, outbuff); fprintf(fp2, "%c", '\n'); fflush(fp2); fclose(fp); fclose(fp2); } void parsedata(char **buffer, char **outpbuff) { int ignore = 3; char *cols[felder]; char *backup = NULL; int n = 0; size_t seps = 0; char *last = NULL; char *lastconcat = NULL; char *p; int x, first = 1; *outpbuff[0] = 0; lastconcat = *outpbuff; for (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 (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++; } }