Leer directamente de un archivo plano (.txt)

5,388 views
Skip to first unread message

esteban micossi

unread,
Jun 23, 2013, 7:04:50 PM6/23/13
to publice...@googlegroups.com
Hola Grupo
 
Resulta que tengo un archivo con aprox. 3.500.000 registros, mas precisamente un archivo de la AFIP (datos de contribuyentes) en donde tiene el cuit, denominación y otros campos que no son relevante. El tema pasa que necesito buscar un dato ya sea cuit o denominación directamente de este archivo sin necesidad de pasarlo a DBF u otra tabla.
Como podría lograrlo ?.
Bueno gente muy agradecido.
Abrazos
Esteban Micossi
 
 

HernanCano

unread,
Jun 23, 2013, 7:50:33 PM6/23/13
to publice...@googlegroups.com
Hola.
Podrías utilizar funciones de bajo nivel (FOPEN(), FREAD(), FGETS()) para leer cada renglón y así --como cada renglón está en una vble de memoria-- comparar si está contenido el CUIT o la DESC.

Chao.

mapner

unread,
Jun 23, 2013, 9:26:25 PM6/23/13
to publice...@googlegroups.com
Esteban,

Como bien dice Hernan una opción sería apelar a las funciones de manejo de archivos FOPEN, FREAD, etc...

Otra si te da la memoria sería levantar el archivo con FILETOSTR y luego tratarlo como un  campo memo
FOR nI = 1 TO ALINES(aLineas)
  * buscar en aLineas[nI]
ENDFOR
pero con 3,5M de registros habría que ver...

y por último la opción de un cursor auxiliar de un solo campo de texto

CREATE CURSOR arcx (TEXTO C(255))
* luego lo llenas con la lectura del archivo de texto...
APPEND FROM (cFileTXT) SDF

* para buscar los datos ...
LOCATE FOR 'PEREZ' $ TEXTO

o

LOCATE FOR '99-99999999-9' $ TEXTO

o bien si sabes las posiciones exactas

LOCATE FOR SUBSTRING(TEXTO,nPosCUIT,13) = '99-99999999-9'

Si la PC es rápida el tiempo de 'levantado' no tendría que ser muy grande...

Acá están desarrollados algunos ejemplos de las 3 opciones...


saludos 

esteban micossi

unread,
Jun 24, 2013, 12:56:29 AM6/24/13
to publice...@googlegroups.com
Gracias por las respuestas.
En realidad  hice una rutina que lo paso todo con append from a una DBF y allí hago la consulta, lo que pasa es que quería que el usuario cuando bajara el archivo de la pagina de AFIP, directamente lea desde este archivo que pesa 50 mega, en cambio si lo paso a DBF se me va un archivo arriba de 1.5 giga.
Bueno amigos gracias de todos modo
Saludos
Esteban Micossi
 

Fernando D. Bozzo

unread,
Jun 24, 2013, 1:19:41 PM6/24/13
to publice...@googlegroups.com
Hola Esteban:

Como poder hacerlo, podés leerlo como te comentaron, usando FREAD() o FGETS() si los registros están separados por retorno de carro. El asunto que importa es si necesitás poder hacer búsquedas en ese formato y qué campos son por los que querías buscar, porque un TXT no es nada óptimo para hacer búsquedas, y mucho menos con esa cantidad de registros.


Carlos Miguel FARIAS

unread,
Jun 25, 2013, 7:32:30 AM6/25/13
to Grupo Fox
Coincido con Fernando.
He tenido que parsear archivos de texto de mas de 200 Mb, y la opción fue usar las funciones Fxxxx (FOPEN, FREAD, FGET) y a partir de alli, analizar cada línea para extraer datos.
El proceso dependera de la velocidad de la máquina, pero nunca vas a lograr una respuesta "usable" (menos 10"), es más, no se si lograrias una respuesta así de rápida sobre una tabla dbf sin indices.
La función FILETOSTR podría llegar a ser más rápida, pero la carga de la memoria va a ser elevada, y lo que aumenta la velocidad de lectura, hace el programa más lento para digerir tamaño bocado de datos.
Si el archivo tiene estructura CSV, habría que probar con los comandos de copia o importación que manejan ese formato.
Y si no con:
Crear una tabla de destino, sin indices, inicialmente
FOPEN() para abrir
Bucle Principal
FGETS() para leer hasta un salto de carro
ALINES para separar cada campo (separado por comas o puntos y coma)
Un bucle para convertir los datos al tipo correcto (o eliminar algún caracter redundante, por ejemplo comillas en un campo de texto).
un INSERT INTO tuTablaDestino FROM ARRAY
Fin Bucle Principal
Crear indices apropiados sobre tuTablaDestino

Porque entiendo que la conversión se hará periodicamente.

La tabla final, si será eficiente en busquedas por indice, o en todo caso, en algún select que pueda usar los indices, para todo lo demás masterpaciencia.
Saludos: Miguel, La Pampa (RA)

elkin dario uribe torres

unread,
Jun 25, 2013, 8:56:21 AM6/25/13
to publice...@googlegroups.com
Buenas dias Esteban

Lo que he implementado para buscar informacion en archivos planos de gran tamaño sin necesidad de bajar la informacion a una tabla y que por demas no son normalizados (12 años de informacion de las factura de Impuesto Predial e Industria y comercio) fue crear un formulario donde se le preguntan los datos a buscar en este caso seria tipo de impuesto, periodo, año y por ultimo ficha y de ahi a buscarlo son solo segundos utilizando los comandos que te pongo mas abajo de acuerdo a lo que se desea.

1. FILETOSTR()
2. STREXTRACT()
3. LEN()
4. RAT() 
5. MLINE()
6. SUBSTR()

Y por cuestiones de presentacion el comando  STRTRAN(), solo seria como dicen los compañeros mirar el archivo como es su estructura y de acuerdo a eso comenzar a programar.  te dejo el diseño de pantalla que hice, pero como ese tengo varios de acuerdo a la infomacion recibida.

Saludos


Elkin uribe

Archivo texto.png
busqueda archivo texto.png

Leonardo Zulli

unread,
Jun 26, 2013, 9:24:53 AM6/26/13
to publice...@googlegroups.com
Hola Esteban, te comento, lo que podes hacer es lo siguiente:

1. Crear un cursor mediante el comando CREATE CURSOR cur_algo (...)
2. Indexar los campos del cursor, (esto si estás trabajando con VFP9)
3. Mediante la siguiente instrucción, cargas los datos del txt al cursor:

SELECT cur_Articulos
APPEND FROM "intercambio\update_list.txt" DELIMITER WITH CHARACTER "|"

En mi caso lo tengo delimitado con "|", pero, si necesitas más detalles de este comando te recomiendo consultar el MSDN de Microsoft
De esta forma vas a poder buscar como si estarías trabajando con una DBF, pero la realidad es que no usas una DBF, sino un cursor en memoria que va a contener los registros. Supuestamente no deberías tener problemas con la cantidad de registros que tenes que levantar.
Esta es la forma más fácil, la otra forma es como ya te explicó HernanCano.


El domingo, 23 de junio de 2013 20:04:50 UTC-3, esteban micossi escribió:
Reply all
Reply to author
Forward
0 new messages