[c#] Leer archivo grande txt

774 views
Skip to first unread message

Rubén Duarte

unread,
May 14, 2011, 7:55:18 PM5/14/11
to Dario Quintana

Estimados, tengo que parsear un archivo de texto de 3.5 gigas (contiene 65 millones de registros) y obtener cierta información de él. Que me recomiendan para leerlo?

Gracias!

 

 

Rubén Duarte

 

Carlos Peix

unread,
May 15, 2011, 9:31:27 AM5/15/11
to Dario Quintana
Con la informacion que nos das la respuesta seria empezar a leer desde el principio hasta llegar al final.

No obstante, supongo que tendras algunas otras restricciones, por ejemplo, que el proceso de lectura no tarde dos semanas :-)

Podras pasarnos mas informacion? por ejemplo: la longitud de registro es constante? tiene algun orden especifico? en que entorno funcionaria este proceso (servicio windows, aplicacion de escritorio, aplicacion web, etc)? tenes limites de tiempo para levantar la informacion?

----------------------------------
Carlos Peix

2011/5/14 Rubén Duarte <ruben...@hydsolutions.com.ar>

Esteban Grinberg

unread,
May 15, 2011, 9:48:46 AM5/15/11
to Dario Quintana
Podes usar SSIS o algun ETL. Funcionan bastante bien a la hora de leer archivos enormes.

2011/5/15 Carlos Peix <peix-...@praxia.com.ar>

Sebastián Molinari

unread,
May 15, 2011, 7:30:44 PM5/15/11
to Dario Quintana
Les recomiendo pentaho. Es un etl open source y lo podes invocar muy fácil desde c# por linea de comando

Sent from my iPhone

Oscar Onorato

unread,
May 15, 2011, 9:25:35 PM5/15/11
to Dario Quintana
Rubén,

No creo saber más que los dos colegas que ya te respondieron. Pero me acuerdo que tuve que hacer algo similar con VB 6.0 sólo con el motor Jet y con un archivo al que tenía que encriptar.
En aquel momento terminé descubriendo los Streams y fue de maravillas con un archivo txt que sería proporcional al tuyo.
Yo intentaría ver que entrega cada StringBuilder por cada x registros y después ver si te sirve. Pero si VB 6.0 me permitía hacer eso con un archivo encriptado, hoy debe ser mucho más fácil.
No te compliques, busquemos la solución más sencilla e inmediata y después vemos.
¿Ya probaste con los StringBuilders como Streams?

Espero tu respuesta, saludos


El 15 de mayo de 2011 10:31, Carlos Peix <peix-...@praxia.com.ar> escribió:
Con la informacion que nos das la respuesta seria empezar a leer desde el principio hasta llegar al final.

No obstante, supongo que tendras algunas otras restricciones, por ejemplo, que el proceso de lectura no tarde dos semanas :-)

Podras pasarnos mas informacion? por ejemplo: la longitud de registro es constante? tiene algun orden especifico? en que entorno funcionaria este proceso (servicio windows, aplicacion de escritorio, aplicacion web, etc)? tenes limites de tiempo para levantar la informacion?

----------------------------------
Carlos Peix

2011/5/14 Rubén Duarte <ruben...@hydsolutions.com.ar>

Estimados, tengo que parsear un archivo de texto de 3.5 gigas (contiene 65 millones de registros) y obtener cierta información de él. Que me recomiendan para leerlo?

Gracias!

 

 

Rubén Duarte

 





--
Oscar R. Onorato

Ramos, Alejandro

unread,
May 16, 2011, 10:17:26 AM5/16/11
to Dario Quintana

Hola Rubén,

Una vez hice algo parecido, no con un archivo tan grande, y opte por crear una tabla en una base de datos donde guardaba los datos que necesitaba, mas el registro original, por si había algún error al leer el registro, por ej. error de parseo. Luego podes manejar los datos de la manera que quieras.

El problema que tenes vos es el tamaño del archivo que te crearía una base un poco grande, no se cuál es tu situación, pero hoy dia creo que el espacio en disco no es una limitación. Otro punto es ver si te aloca toda la memoria de un saque, alguno sabe?

 

Saludos,

Alejandro

 

 

De: c#@mug.org.ar [mailto:c#@mug.org.ar] En nombre de Rubén Duarte
Enviado el: sábado, 14 de mayo de 2011 08:55 p.m.
Para: Ramos, Alejandro
Asunto: [c#] Leer archivo grande txt

 

Este es un correo Entrante desde Internet. No podemos autentificar su remitente.
Trátese esta información con discreción. Seguridad Informática-Molinos Rio de la Plata.


 

Estimados, tengo que parsear un archivo de texto de 3.5 gigas (contiene 65 millones de registros) y obtener cierta información de él. Que me recomiendan para leerlo?

Gracias!

 

 

Rubén Duarte

 



Los datos contendidos en el mensaje precedente pueden tener información de propiedad exclusiva de Molinos Río de la Plata S.A., sus afiliadas o subsidiarias. En virtud de ello, se otorga a éste el carácter de CONFIDENCIAL y se impone a los receptores del mismo la obligación de resguardar y proteger su difusión y de no divulgarlo sin autorización.
Asimismo, si hubiere recibido éste por error deberá comunicarlo, vía email a SeguridadI...@Molinos.com.ar ,o por fax al +54(11)43401105, y proceder a destruir el mensaje en forma inmediata.
Atte. Molinos Río de la Plata S.A.

This transmittal and/or attachments may contain confidential and proprietary information of Molinos Río de la Plata, its afiliates or subsidiaries. If you are not the intended recipient, you are hereby notified that you have received this transmittal in error; any review, dissemination, distribution or copying of this transmittal is strictly prohibited.
If you have received this transmittal and/or attachments in error, please notify us immediately by mail to SeguridadI...@Molinos.com.ar or by fax to +54(11)43401105 and destroy this message and all its attachments.

Cristian C. Bittel

unread,
May 16, 2011, 10:27:22 AM5/16/11
to Dario Quintana

Así mismo como dice Alejandro lo tuve que hacer alguna vez, insertar en base de datos lo que se parseaba y a la par el registro original. Por velocidad, la única forma satisfactoria era procesar el archivo directamente desde el motor con un procedimiento almacenado. Así que tu mejor opción también puede depender del destino de los datos.

 

Cristian.

Ben Fernando A

unread,
May 16, 2011, 10:28:56 AM5/16/11
to Dario Quintana

Hola!, como es el procedimien to de baja de las listas?

Rubén Duarte

unread,
May 16, 2011, 2:45:27 PM5/16/11
to Dario Quintana

Bueno, gracias a todos por las respuestas, en principio, como pidió Carlos, doy más detalles sobre el tema:

Los campos están separados por comas, vienen 4 campos, y algunos pueden no estar informados

(ej, ZD08JN10623407310,,20140427,975436-001-01,PAL2000H-TTT-GB-XZ)

El primer registro del archivo indica “HEADER,65237420,,,” (el numero es la cantidad de registros con datos)

La aplicación es una aplicación Windows, c#, sql server 2008, pero mi idea es que el usuario que va a ingresar este archivo al sistema, primero lo procese en forma local, (quizás podría incorporar los datos a un sql local, primero), luego de leer la información el usuario debería tener la posibilidad de poder filtrar los datos de acuerdo a cierto group by por alguna de las columnas y en ese filtrado, eliminar unos cuantos millones de registros que en la sucursal Argentina no interesan, para luego incorporar a la base Sql del servidor los registros que sí interesan. Pero mis dudan son, que justamente esta lectura no tarde horas y horas o que no colapse la memoria del equipo mientras este leyendo el archivo, por eso no quiero parsearlo en memoria.

 

 

 

De: c#@mug.org.ar [mailto:c#@mug.org.ar] En nombre de Cristian C. Bittel
Enviado el: Lunes, 16 de Mayo de 2011 11:27
Para: ruben...@hydsolutions.com.ar
Asunto: [c#] Leer archivo grande txt

 

Así mismo como dice Alejandro lo tuve que hacer alguna vez, insertar en base de datos lo que se parseaba y a la par el registro original. Por velocidad, la única forma satisfactoria era procesar el archivo directamente desde el motor con un procedimiento almacenado. Así que tu mejor opción también puede depender del destino de los datos.

 

Cristian.

Ramos, Alejandro

unread,
May 16, 2011, 4:59:40 PM5/16/11
to Dario Quintana
Ruben,
No se si va a durar horas, pero pensa que tenes que procesar un archio de 65 M de registros, por mas optimo que sea al procesamiento, pensa que va a durar bastante.
Si cada registro posee identificador unico (ID) en caso que falle, podes reprocesar hasta que reanude desde donde fallo. Eso le va a a gregar mas tiempo en la subida, pero creo que si o si va a necesitar algun mecanismo asi ya que sino vas a tener que procesar TODA la info cada vez que falle, imaginate su te falla en el 99% del archivo, clasico de una insatalacion :P
La otra opcion es subir todo procesado, y los que fallen al subirlos igual a la base, y luego reprocesarlos, o analizar por que no se pudieron parsear.
Si vas a subir a una base te recomiendo que utilices procedimietos almacenados (SP's) para optimizar la subida.
Lo del SQL local analizalo, si el costo en subir es casi lo mismo, yo te diria que lo subas directamente al servidor, asi una vez que el usario elimina millones, o miles, o cientos, podrias mover los datos con un SP y no transferirlos por la red, pero eso va a depender tambien que cantidad de datos aproximadamente realmente se vayan a subir despues del filtrado.
 
Espero encuentres una solucion y avisa como lo hiciste
 
Saludos,
Alejandro
 

De: c#@mug.org.ar [c#@mug.org.ar] En nombre de Rubén Duarte [ruben...@hydsolutions.com.ar]
Enviado el: lunes, 16 de mayo de 2011 03:45 p.m.

Carlos Peix

unread,
May 16, 2011, 5:29:13 PM5/16/11
to Dario Quintana
Hola Ruben,

Creo que lo mas razonable es establecer alguna linea de base para empezar a analizar opciones. Sugiero que hagas una prueba con cada una de las herramientas ya construidas que te han recomendado.

Luego, si los tiempos son inaceptables y no hay maneras de mejorarlos, podemos darte una mano con un procesador hecho a mano.

Abrazo

----------------------------------
Carlos Peix

2011/5/16 Rubén Duarte <ruben...@hydsolutions.com.ar>

Ramsay

unread,
May 16, 2011, 5:48:23 PM5/16/11
to Dario Quintana
hola todos.... yo si creo que deberia primero que todo importarlo en un una db local (para lo cual ya estan las herramientas hechas) y despues que esto resulte satisfactorio entonces trabajar en un script para parsear y subir los datos buenos a un server sql real !

saludos




On 5/16/2011 5:29 PM, Carlos Peix wrote:
Hola Ruben,

Creo que lo mas razonable es establecer alguna linea de base para empezar a analizar opciones. Sugiero que hagas una prueba con cada una de las herramientas ya construidas que te han recomendado.

Luego, si los tiempos son inaceptables y no hay maneras de mejorarlos, podemos darte una mano con un procesador hecho a mano.

Abrazo

----------------------------------
Carlos Peix

2011/5/16 Rub�n Duarte <ruben...@hydsolutions.com.ar>

Bueno, gracias a todos por las respuestas, en principio, como pidi� Carlos, doy m�s detalles sobre el tema:

Los campos est�n separados por comas, vienen 4 campos, y algunos pueden no estar informados

(ej, ZD08JN10623407310,,20140427,975436-001-01,PAL2000H-TTT-GB-XZ)

El primer registro del archivo indica �HEADER,65237420,,,� (el numero es la cantidad de registros con datos)

La aplicaci�n es una aplicaci�n Windows, c#, sql server 2008, pero mi idea es que el usuario que va a ingresar este archivo al sistema, primero lo procese en forma local, (quiz�s podr�a incorporar los datos a un sql local, primero), luego de leer la informaci�n el usuario deber�a tener la posibilidad de poder filtrar los datos de acuerdo a cierto group by por alguna de las columnas y en ese filtrado, eliminar unos cuantos millones de registros que en la sucursal Argentina no interesan, para luego incorporar a la base Sql del servidor los registros que s� interesan. Pero mis dudan son, que justamente esta lectura no tarde horas y horas o que no colapse la memoria del equipo mientras este leyendo el archivo, por eso no quiero parsearlo en memoria.

�

�

�

De: c#@mug.org.ar [mailto:c#@mug.org.ar] En nombre de Cristian C. Bittel
Enviado el: Lunes, 16 de Mayo de 2011 11:27
Para: ruben...@hydsolutions.com.ar


Asunto: [c#] Leer archivo grande txt

�

As� mismo como dice Alejandro lo tuve que hacer alguna vez, insertar en base de datos lo que se parseaba y a la par el registro original. Por velocidad, la �nica forma satisfactoria era procesar el archivo directamente desde el motor con un procedimiento almacenado. As� que tu mejor opci�n tambi�n puede depender del destino de los datos.

�

Cristian.

�

De: c#@mug.org.ar [mailto:c#@mug.org.ar] En nombre de Ramos, Alejandro


Enviado el: lunes, 16 de mayo de 2011 11:17
Asunto: [c#] Leer archivo grande txt

�

Hola Rub�n,

Una vez hice algo parecido, no con un archivo tan grande, y opte por crear una tabla en una base de datos donde guardaba los datos que necesitaba, mas el registro original, por si hab�a alg�n error al leer el registro, por ej. error de parseo. Luego podes manejar los datos de la manera que quieras.

El problema que tenes vos es el tama�o del archivo que te crear�a una base un poco grande, no se cu�l es tu situaci�n, pero hoy dia creo que el espacio en disco no es una limitaci�n. Otro punto es ver si te aloca toda la memoria de un saque, alguno sabe?

�

Saludos,

Alejandro

�

�

De: c#@mug.org.ar [mailto:c#@mug.org.ar] En nombre de Rub�n Duarte
Enviado el: s�bado, 14 de mayo de 2011 08:55 p.m.
Para: Ramos, Alejandro
Asunto: [c#] Leer archivo grande txt

�

Este es un correo Entrante desde Internet. No podemos autentificar su remitente.

Tr�tese esta informaci�n con discreci�n. Seguridad Inform�tica-Molinos Rio de la Plata.


�

Estimados, tengo que parsear un archivo de texto de 3.5 gigas (contiene 65 millones de registros) y obtener cierta informaci�n de �l. Que me recomiendan para leerlo?

Gracias!

�

�

Rub�n Duarte

�

�


Los datos contendidos en el mensaje precedente pueden tener informaci�n de propiedad exclusiva de Molinos R�o de la Plata S.A., sus afiliadas o subsidiarias. En virtud de ello, se otorga a �ste el car�cter de CONFIDENCIAL y se impone a los receptores del mismo la obligaci�n de resguardar y proteger su difusi�n y de no divulgarlo sin autorizaci�n.
Asimismo, si hubiere recibido �ste por error deber� comunicarlo, v�a email a SeguridadI...@Molinos.com.ar ,o por fax al +54(11)43401105, y proceder a destruir el mensaje en forma inmediata.
Atte. Molinos R�o de la Plata S.A.

This transmittal and/or attachments may contain confidential and proprietary information of Molinos R�o de la Plata, its afiliates or subsidiaries. If you are not the intended recipient, you are hereby notified that you have received this transmittal in error; any review, dissemination, distribution or copying of this transmittal is strictly prohibited.

Carlos Peix

unread,
May 16, 2011, 6:01:49 PM5/16/11
to Dario Quintana
Ah, eso me olvide de decir. Yo no creo que sea apropiado volcar todos los registros a la DB local, me parece preferible leer linea por linea, filtrar y recien en ese momento pasar a la DB (ya sea una tabla intermedia o la definitiva).

Por supuesto que aun no sabemos la relacion que usualmente nuestro amigo tiene entre total de registros y candidatos a importar. Eso podria ayudar a definir.

----------------------------------
Carlos Peix

2011/5/16 Ramsay <rams...@gmail.com>
hola todos.... yo si creo que deberia primero que todo importarlo en un una db local (para lo cual ya estan las herramientas hechas) y despues que esto resulte satisfactorio entonces trabajar en un script para parsear y subir los datos buenos a un server sql real !

saludos




On 5/16/2011 5:29 PM, Carlos Peix wrote:
Hola Ruben,

Creo que lo mas razonable es establecer alguna linea de base para empezar a analizar opciones. Sugiero que hagas una prueba con cada una de las herramientas ya construidas que te han recomendado.

Luego, si los tiempos son inaceptables y no hay maneras de mejorarlos, podemos darte una mano con un procesador hecho a mano.

Abrazo

----------------------------------
Carlos Peix

2011/5/16 Rubén Duarte <ruben...@hydsolutions.com.ar>

Bueno, gracias a todos por las respuestas, en principio, como pidió Carlos, doy más detalles sobre el tema:

Los campos están separados por comas, vienen 4 campos, y algunos pueden no estar informados

(ej, ZD08JN10623407310,,20140427,975436-001-01,PAL2000H-TTT-GB-XZ)

El primer registro del archivo indica “HEADER,65237420,,,” (el numero es la cantidad de registros con datos)

La aplicación es una aplicación Windows, c#, sql server 2008, pero mi idea es que el usuario que va a ingresar este archivo al sistema, primero lo procese en forma local, (quizás podría incorporar los datos a un sql local, primero), luego de leer la información el usuario debería tener la posibilidad de poder filtrar los datos de acuerdo a cierto group by por alguna de las columnas y en ese filtrado, eliminar unos cuantos millones de registros que en la sucursal Argentina no interesan, para luego incorporar a la base Sql del servidor los registros que sí interesan. Pero mis dudan son, que justamente esta lectura no tarde horas y horas o que no colapse la memoria del equipo mientras este leyendo el archivo, por eso no quiero parsearlo en memoria.

 

 

 

De: c#@mug.org.ar [mailto:c#@mug.org.ar] En nombre de Cristian C. Bittel
Enviado el: Lunes, 16 de Mayo de 2011 11:27
Para: ruben...@hydsolutions.com.ar


Asunto: [c#] Leer archivo grande txt

 

Así mismo como dice Alejandro lo tuve que hacer alguna vez, insertar en base de datos lo que se parseaba y a la par el registro original. Por velocidad, la única forma satisfactoria era procesar el archivo directamente desde el motor con un procedimiento almacenado. Así que tu mejor opción también puede depender del destino de los datos.

 

Cristian.

 

De: c#@mug.org.ar [mailto:c#@mug.org.ar] En nombre de Ramos, Alejandro


Enviado el: lunes, 16 de mayo de 2011 11:17
Asunto: [c#] Leer archivo grande txt

 

Hola Rubén,

Una vez hice algo parecido, no con un archivo tan grande, y opte por crear una tabla en una base de datos donde guardaba los datos que necesitaba, mas el registro original, por si había algún error al leer el registro, por ej. error de parseo. Luego podes manejar los datos de la manera que quieras.

El problema que tenes vos es el tamaño del archivo que te crearía una base un poco grande, no se cuál es tu situación, pero hoy dia creo que el espacio en disco no es una limitación. Otro punto es ver si te aloca toda la memoria de un saque, alguno sabe?

 

Saludos,

Alejandro

 

 

De: c#@mug.org.ar [mailto:c#@mug.org.ar] En nombre de Rubén Duarte
Enviado el: sábado, 14 de mayo de 2011 08:55 p.m.
Para: Ramos, Alejandro
Asunto: [c#] Leer archivo grande txt

 

Este es un correo Entrante desde Internet. No podemos autentificar su remitente.
Trátese esta información con discreción. Seguridad Informática-Molinos Rio de la Plata.


 

Estimados, tengo que parsear un archivo de texto de 3.5 gigas (contiene 65 millones de registros) y obtener cierta información de él. Que me recomiendan para leerlo?

Gracias!

 

 

Rubén Duarte

 

 


Los datos contendidos en el mensaje precedente pueden tener información de propiedad exclusiva de Molinos Río de la Plata S.A., sus afiliadas o subsidiarias. En virtud de ello, se otorga a éste el carácter de CONFIDENCIAL y se impone a los receptores del mismo la obligación de resguardar y proteger su difusión y de no divulgarlo sin autorización.
Asimismo, si hubiere recibido éste por error deberá comunicarlo, vía email a SeguridadI...@Molinos.com.ar ,o por fax al +54(11)43401105, y proceder a destruir el mensaje en forma inmediata.
Atte. Molinos Río de la Plata S.A.

This transmittal and/or attachments may contain confidential and proprietary information of Molinos Río de la Plata, its afiliates or subsidiaries. If you are not the intended recipient, you are hereby notified that you have received this transmittal in error; any review, dissemination, distribution or copying of this transmittal is strictly prohibited.

daniel...@gmail.com

unread,
May 16, 2011, 6:43:38 PM5/16/11
to Dario Quintana
Para volumenes tan grandes usaria Pentaho
Procesa los archivos por lotes, hace transformaciones
Es multiplataforma
Maneja volumen con mucha eficiencia
Lo usamos en el banco donde trabajo, es un monstruito

:)

Daniel

Enviado desde mi BlackBerry de Movistar (http://www.movistar.com.ar)


From: Carlos Peix <peix-...@praxia.com.ar>
Sender: c#@mug.org.ar
Date: Mon, 16 May 2011 19:01:49 -0300
ReplyTo: c#@mug.org.ar
Subject: [c#] Leer archivo grande txt

Rubén Duarte

unread,
May 27, 2011, 9:04:02 AM5/27/11
to Dario Quintana

Bueno, un poco tarde mi respuesta, Gracias Daniel, voy por Pentaho, estuve mirándolo medio por encima y es muy completo!!

 

Mas adelante te cuento como me va con esta herramienta.

Gracias!!

Reply all
Reply to author
Forward
0 new messages