Ciertamente cada linea tiene el hash y al lado la ruta relativa al archivo con lo que lo que busco para ordenar es la ruta y no el md5 ya que este puede haber cambiado y no lo encontraria.
El caso es que aparentemente parece que funciona pero tarda para unas 70000 lineas como 5 minutos para ordenarlas en un tercer archivo. ¿Hay alguna manera de optimizarlo sin usar bases de datos?
Aqui el codigo:
Código C:
El caso es que si está mas o menos ordenado al empezar pues cuanto mas avance mas tardará en encontrar el siguiente y asi hasta el final y si es muy largo el archivo pues se puede hacer eterno jajaja. Ver original
//--------------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <errno.h> #include <limits.h> #define SIZEMAX 1024 //--------------------------------------------------------------------------- typedef enum { STR2INT_SUCCESS, STR2INT_OVERFLOW, STR2INT_UNDERFLOW, STR2INT_INCONVERTIBLE } str2int_errno; int CheckFileError(FILE *fichero,char *fullpath) { int error=0; if(fichero == NULL){ printf("No se pudo abrir el archivo %s. Asegurese de que la ruta y el nombre son correctos.\n",fullpath); error=-1; } return error; } //--------------------------------------------------------------------------- void CerrarArchivos(FILE **origen1,FILE **origen2,FILE **destino2) { if(*origen1 != NULL){ *origen1=NULL; if(*origen2 != NULL){ *origen2=NULL; if(*destino2 != NULL){ *destino2=NULL; } } } } //--------------------------------------------------------------------------- int AbrirArchivos(FILE **origen1,FILE **origen2,FILE **destino2,char *pathOrigen1,char *pathOrigen2,char *pathDestino2) { int error; if((error=CheckFileError(*origen1,pathOrigen1))!=0){ CerrarArchivos(origen1,origen2,destino2); return error; } if((error=CheckFileError(*origen2,pathOrigen2))!=0){ CerrarArchivos(origen1,origen2,destino2); return error; } if((error=CheckFileError(*destino2,pathDestino2))!=0){ CerrarArchivos(origen1,origen2,destino2); return error; } return error; } //--------------------------------------------------------------------------- void clean(void) { char a; } //--------------------------------------------------------------------------- void ObtenerRutas(char *pathOrigen1,char *pathOrigen2,char *pathDestino2,int *largoHash) { int largo; if(pathOrigen1[largo-1]!='\n'){ clean(); }else{ pathOrigen1[largo-1]='\0'; } if(pathOrigen2[largo-1]!='\n'){ clean(); }else{ pathOrigen2[largo-1]='\0'; } if(pathDestino2[largo-1]!='\n'){ clean(); }else{ pathDestino2[largo-1]='\0'; } } //--------------------------------------------------------------------------- //Para convertir el parametro del largo del hash de cadena a entero str2int_errno str2int(int *out, char *s, int base) { char *end; long l; return STR2INT_INCONVERTIBLE; errno = 0; if (l > INT_MAX || (errno == ERANGE && l == LONG_MAX)) return STR2INT_OVERFLOW; if (l < INT_MIN || (errno == ERANGE && l == LONG_MIN)) return STR2INT_UNDERFLOW; if (*end != '\0') return STR2INT_INCONVERTIBLE; *out = l; return STR2INT_SUCCESS; } //--------------------------------------------------------------------------- int CheckParams(int nParametros, char *parametros[], char *pathOrigen1,char *pathOrigen2,char *pathDestino2,int *largoHash) { str2int_errno error_param_hash; char mensaje[SIZEMAX]; if(nParametros == 5){ error_param_hash=str2int(largoHash,parametros[4],10); switch(error_param_hash){ case STR2INT_OVERFLOW: break; case STR2INT_UNDERFLOW: break; case STR2INT_INCONVERTIBLE: break; } if(error_param_hash != STR2INT_SUCCESS){ return -1; } if(*largoHash < 0){ printf("El valor asignado al largo del hash no puede ser menor que '0'.\nSi no hay hash ponga '0'.\n"); return -1; } }else if(nParametros > 1){ return -1; }else{ ObtenerRutas(pathOrigen1,pathOrigen2,pathDestino2,largoHash); } return 0; } //--------------------------------------------------------------------------- void CrearFicheroOrdenado(char *pathOrigen1,char *pathOrigen2,char *pathDestino2,int largoHash) { char buffer1[SIZEMAX]; char buffer2[SIZEMAX]; FILE *origen1=NULL,*origen2=NULL,*destino2=NULL; int encontrado,largo,noEncontrados=0; if(AbrirArchivos(&origen1,&origen2,&destino2,pathOrigen1,pathOrigen2,pathDestino2)==0){ encontrado=0; encontrado=1; break; } } if(encontrado==1) else{ noEncontrados++; } } CerrarArchivos(&origen1,&origen2,&destino2); if(noEncontrados > 0) } } //--------------------------------------------------------------------------- //Se puede usar con parametros tambien int main(int argc, char* argv[]) { char pathOrigen1[SIZEMAX]; char pathOrigen2[SIZEMAX]; char pathDestino2[SIZEMAX]; int largoHash; if(CheckParams(argc,argv,pathOrigen1,pathOrigen2,pathDestino2,&largoHash) == 0) CrearFicheroOrdenado(pathOrigen1,pathOrigen2,pathDestino2,largoHash); return 0; } //---------------------------------------------------------------------------