![]() |
Partir Archivos
Delphi 7 Enterprise
Tengo un archivo plano bastante grande, y necesito partirlo en trozos mas pequeños para hacerlo mas manejable, y poder procesarlos de manera individual. Intente con un procedimiento que utiliza BLOCKREAD y BLOCKWRITE, pero tengo un problema. Si el registro es este 1,EPS028,CC,38471049,SALAZAR,CARDONA 2,EPS028,CC,29897965,MARTINEZ,DE 3,EPS028,RC,31600888,GARCIA,OSPINA 4,EPS028,CC,9990036,HERRERA,ROBLEDO Si por ejemplo quiero partirlo en nuevos archivos de 2 registros cada uno, obtengo 1,EPS028,CC,38471049,SALAZAR,CARDONA 2,EPS028,CC,29897 Es decir, algunos registros quedan incompletos. El archivo pude traer cualquier cantidad de campos (separados por comas), y generalmente son muy grandes (> 50 MB). Como puedo hacer para partir una cantidad especifica de registros, pero con la tranquilidad de que estos queden completos? Muchas gracias |
Así de pronto, se me ocurre algo como esto:
EDITO: El código corregido se encuentra mas abajo |
seoane, probe el código y si, me crea los dos archivos, solo que en el primero me hace una copia del original y el segundo me deja un archivo vacio.
Salvo tu mejor opinion, lo que yo haría es hacer un barrido del archivo para saber cuantas lineas tiene (quiero pensar que es una archivo con LFyCR). Después sí, crear los archivos (2,3,4, los que se deseen) pero partiendolos por lineas y no por bytes. Saludos |
Efectivamente egostar, parece que la instrucción FileSize no funciona muy bien con los archivos de texto. Pero todo tiene solución:
|
Hombre, pues quedo de 10.
Hice dos pruebas. 1. Con lineas pares, es decir, 12 lineas Creo los dos archivos con 6 lineas cada uno, perfecto. 2. Con lineas impares, 11 lineas Debo reconocer que pense mal, pense que en lineas impares habria un bug y partiria una linea a la mitad, pero no, sorpresa, deja 6 lineas en uno y 5 lineas en el segundo. Saludos y mis respetos |
Y para dar mas alternativas. Probemos con TStringList:
Partiendo el archivo por numero de lineas:
y por tamaño en bytes:
Las ventaja de usar TStringList es que el se encarga de corregir los posibles problemas con los retornos de carro. La desventaja es el intenso trabajo sobre la memoria. |
¿blockread?
Amigos, muchas gracias por las ideas que me han dado.
Le verdad SI he partido los archivos utilizando TStringList, y recorriendo el archivo original, y me ha funcionado muy bien, solo que es algo lento. Definitivamente a nadie se le ocurre como utilizar blockread y blockwrite para este cometido? gracias :o |
Trabajar con archivos de texto y blockread, es algo complicado, se me ocurre algo así, pero no sé si el rendimiento será superior al modelo con StringList:
|
Cita:
De todas formas:
|
Cita:
Cita:
Me pregunto porque forzosamente con el Block Read/Write:confused: Saludos. |
Muchas Gracias
Muchas gracias amigos por darme una luz en la solucion del problema. Lamento no haberme expresado bien desde el principio y no comentarles todo lo que habia intentado previamente.
¿Porque BlockRead y BlockWrite ? Porque por lo que he visto, y leido, es super eficiente, y eso es lo que busco con mis programas. Reciban un fuerte abrazo desde mi hermosa tierra colombiana. Gracias |
La franja horaria es GMT +2. Ahora son las 03:24:59. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi