Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: jpozuelo en 14 Mayo 2016, 19:44 pm



Título: Unir varios ficheros en uno, escribiendo todas las primeras al principio y suc..
Publicado por: jpozuelo en 14 Mayo 2016, 19:44 pm
Buenas tardes amigos.

Estoy trabajando con C,necesito escribir varios ficheros en uno. El problema es que tengo que escribir en el fichero conjunto, todos los datos de los demás en orden. Es decir, al principio, todas las primeras líneas de todos, segunda línea, todas las segundas líneas, etc.

No puedo guardarlo en memoria, pues es un trabajo en BIG Data, y estoy usando 709 ficheros con más de mil líneas de datos cada uno.

¿Cómo lo harían ustedes?

Mil gracias


Título: Re: Unir varios ficheros en uno, escribiendo todas las primeras al principio y suc..
Publicado por: jpozuelo en 15 Mayo 2016, 09:17 am
Así lo he hecho y me funciona bien, pero el programa es poco eficiente, es decir, tarda en torno a 20 minutos en recorrer los 709 ficheros.

Lo que he hecho ha sido, leer todas las primeras líneas y escribir,  así sucesivamente para cada fichero. Pero al tener que cerrar y abrir cada fichero para cada línea el programa tarda demasiado.

Por eso ahora la idea que tengo es leer un archivo concreto y escribirlo, dejándo los huecos enter la primera línea y la segunda en cada fichero, pero ahora tengo el problema de al leer el segundo ficchero escribirlo concretamente en la segunda línea....


Título: Re: Unir varios ficheros en uno, escribiendo todas las primeras al principio y suc..
Publicado por: jpozuelo en 15 Mayo 2016, 10:02 am
Voy a intentar explicarme mejor. Escribo el modelo de fichero que quiero generar:

linea 1     fichero1
linea1      fichero2
linea1      fichero3
....          .....

linea2     fichero1
linea2     fichero2
....         .....


Mi planteamiento ahora es escribir todo el fichero 1 dejando los huecos para poder escribir los sucessivos ficheros, pero mi problema está, en que una vez escrito el primer fichero, como me posiciono en la segunda línea, la escribir la primera linea del segundo fichero.

Muchas gracias por la colaboración.


Título: Re: Unir varios ficheros en uno, escribiendo todas las primeras al principio y suc..
Publicado por: AlbertoBSD en 15 Mayo 2016, 15:34 pm
Así lo he hecho y me funciona bien, pero el programa es poco eficiente, es decir, tarda en torno a 20 minutos en recorrer los 709 ficheros.

¿Cuanto pesan los archivos?
¿Cual es la longitud promedio de la linea?

Puedo hacer un ejemplo con los datos anteriores para ver cuanto tarda en mi computadora.

Realmente es el proceso que te comente en teoría es lo mas eficiente, por que cuando dejas huecos para meter datos tienes que calcular es desplazamiento de donde va quedar el nuevo dato adicional y tendrás que calcular cuanto hueco dejar.

De hecho pensando bien no tienes que estar cerrando y abriendo el archivo destino, simplemente los cierras al final.

Te dejo este codigo de ejemplo, yo asumo que los archivos tienen distinto numero de lineas incluso el programa debe de funcionar para mismo numero de lineas en todos los archivos.

Código
  1. #include<stdio.h>
  2.  
  3. #define N = 700
  4.  
  5. int main() {
  6. int i = 0,entrar = 1,finalizados = 0;
  7. char *nombres[N] = {"Archivo1","Archivo2","Archivo2","Archivo4",...};
  8. char *buffer = calloc(1000,1);
  9. FILE *archivos[N];
  10. FILE *destino;
  11. while(i < N) {
  12. archivos[i] = fopen(nombres[i],"r");
  13. i++;
  14. }
  15. destino = fopen("destino","w");
  16. while(finalizados != (N-1)) {
  17. while(i < N) {
  18. if(archivos[i] != NULL) {
  19. fgets(buffer,1000,archivos[i]);
  20. fprintf(destino,"%s\n",buffer);
  21. memset(buffer,0,1000);
  22. if(feof(archivos[i])) {
  23. fclose(archivos[i]);
  24. archivos[i] = NULL;
  25. finalizados++;
  26. }
  27. }
  28. i++;
  29. }
  30. }
  31. fclose(destino);
  32. }





 


Título: Re: Unir varios ficheros en uno, escribiendo todas las primeras al principio y suc..
Publicado por: jpozuelo en 16 Mayo 2016, 08:03 am
Muchísimas gracias por tu respuesta.

Finalmente no lo voy a hacer literalmente como me comentas dado que no sirve para mis archivos (algo lógico pues no he especificado como son), pero me has dado la idea central para poder mejorar el programa.
Aún lo he probado, cuando lo pruebe comentaré para tratar los resulados.

Muchas gracias por la ayuda