Buscar en archivo txt

Post Reply
surGom
Posts: 624
Joined: Wed Oct 19, 2005 12:03 pm
Contact:

Buscar en archivo txt

Post by surGom »

La Dirección General de Rentas de Provincia de Buenos Aires de nuestro país no tuvo mejor idea que hacer un padrón con lo que hay que cobrar
a cada contribuyente de percepciones ó retenciones, siendo nosotros agente recaudador de ellos (Sí Argentina bendito país),
antes eran alícuotas fijas, pero a algún genio se le ocurrió hacerla más complicada (no tenemos nada que hacer)
y lo hizo que cada contribuyente pague distinto. Para ello o se baja el padrón o bien cada vez que cobras a un cliente o pagás
a un proveedor entras a internet buscas el nro de Cuit (1) buscas los porcentajes a aplicar y podés facturar ó cobrar...
(chino mandarin!!! es mas fácil de aprender que ejecutar esto para una empresa que hade 60 facturas por día)
ó bien bajas el padrón de internet, y hacés un prg que lea y encuentre las alícuotas.
Necesito buscar del padron los clientes que pertenezcan a mi empresa los cuales identifico con los números
posteriores al 3º punto y coma (1) y de ahí extraer los datos de que necesito, pensaba utilizar memoread, etc pero tengo
la limitación de 64k. Pensé en utilizar la clase txt, pero no probé todavía, ya que no lo veo claro. Quizás con Fread?
Me pueden orientar que puedo utilizar.



son en total 1323270 renglones 82megabytes una bicoca
Los primeros renglones son los siguientes

21112007;01122007;31122007;20000000028;D;S;N;6,00;1,75;15;10
21112007;01122007;31122007;20000013677;D;S;N;6,00;1,75;15;10
21112007;01122007;31122007;20000091635;D;S;N;6,00;1,75;15;10
21112007;01122007;31122007;20000125327;C;S;N;6,00;1,75;15;10
21112007;01122007;31122007;20000188426;C;S;N;6,00;1,75;15;10
21112007;01122007;31122007;20000282465;D;S;N;0,00;0,00;01;01

Disculpen lo largo de la explicación.

Luis
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Luis,

Puedes usar perfectamente MemoRead() y luego At(), ya que en 32 bits no existe la limitación de los 64 Ks y los ordenadores 32 bits de hoy en dia tienen memoria de sobra para cargar ficheros grandes (hasta 4 GB) en memoria
regards, saludos

Antonio Linares
www.fivetechsoft.com
surGom
Posts: 624
Joined: Wed Oct 19, 2005 12:03 pm
Contact:

Post by surGom »

Gracias Antonio, cuando venía hacia la oficina se me ocurrió que podía ser como con los array, pero nada mejor que me lo confirmen.

Luis
surGom
Posts: 624
Joined: Wed Oct 19, 2005 12:03 pm
Contact:

Post by surGom »

Bueno pude leer archivos txt y utilizando la función StrToken estraer lo necesario, pero en archivos pequeños. El que necesitaba es de 82 megas, no pude. Utilizando mlcount, me lee los renglones y eso me dio falsas expectativas porque al querer leerlo se queda sin hacer nada, permitiendo entrar a otras áreas del programa como si nada ocurriese, pero al cerrar el programa lo hace pero quedando en memoria una copia del mismo.

La solución que hallé fue pasar el txt a acces y de ahí a dbf. Lo que implicó tener que quitar campos no imprescindibles pero sí buenos complementos de información, luego modificar la anchura de campos (demoraba casi 10 minutos), ya que el archivo original que venía de acces a dbf era de 450 megas!!!.

La cuestión es que esto hay que hacerlo todos los meses y necesitaría saber si alguien tiene idea de como puedo leer el archivo usando mi programa , o en su defecto hacer un externo. Quise con fread pero no se como buscar y extraer. Y si es esta la solución.
Espero sus comentarios

EJ de como lee archivos txt Esto funcionó perfecto hasta 28000 bytes, luego de eso lo comentado

do

cLinea := memoline(cTexto,60,z)
cCuit := STRTRAN(odbf:cuit, "-", "")
if substr(cLinea,28,11 ) = cCuit
? "HOLA"
MsgInfo( StrToken( cTexto, 9, ";" ) )
odbf:skip()
? odbf:cuit
return
endif
sysrefresh()

z := z +1
until z = nCuento .or. odbf:eof()
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

MemoLine() es una función muy lenta ya que busca la línea desde el principio del texto, una y otra vez.

Hazlo de esta manera:

Code: Select all

// nFrom hay que pasarlo por referencia "@" y empieza valiendo 1

function ExtractLine( cText, nFrom )

  local cLine, nAt

  nAt := At( CRLF, SubStr( cText, nFrom ) )

  if nAt > 0
    cLine := Substr( cText, nFrom, nAt - 1 )
    nFrom += nAt + 1
  else
    cLine := Substr( cText, nFrom )
    nFrom := Len( cText ) + 1
  endif

return cLine
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
ADBLANCO
Posts: 299
Joined: Mon Oct 22, 2007 3:03 pm
Location: Valencia - Venezuela

Post by ADBLANCO »

ESTE ES UN FUENTE PARA LEER ARCHIVOS DE TEXTO, ESPERO QUE TE SIRVA DE ALGO


PARAM ARCH_DIC
MAXLINE=512
HANDLE=FOPEN(ARCH_DIC)
DO WHILE .T.
BUFFER=SPACE(MAXLINE)
NUM_BYTES=FREAD(HANDLE,@BUFFER ,MAXLINE)
LINE_END=AT(CHR(13)+CHR(10),BUFFER)
IF LINE_END#0

? SUBSTR(BUFFER,1,LINE_END)

FSEEK(HANDLE,LINE_END+1-NUM_BYTES,1)
ELSE
FSEEK(HANDLE,0)
EXIT
ENDIF
ENDDO
FCLOSE(ARCH_DIC)
surGom
Posts: 624
Joined: Wed Oct 19, 2005 12:03 pm
Contact:

Post by surGom »

Antonio con el código que me enviaste probé con un archivo de 7 megas y lo lee perfecto, lo único es que demora unos 12 minutos. Lo que noté que a medida que avanza la lectura, más rápido resuelve. El archivo completo tiene 82 megas, es decir intratable. no sólo para el programa de fwh sino que también para editplus2, ya que quise cambiar los ; por comas y quitar las comas en los numéricos, para poder exportarlo a dbf y tambíen se satura y cuelga???. Lo que quisiera saber si hay algún idioma ya sea c++, delphi, visualbasic ,etc , que lo pueda leer y trabajar en el mismo sin salir del código de programa.

Voy a probar con la solución que me envió ADBLANCO a ver que pasa.
Me interesaría saber lo de otros idiomas por curiosidad

Gracias
Espero sus comentarios
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

La máxima velocidad la conseguirías escribiendo una función especifica en lenguaje C que haga el trabajo, sin tener que subir a nivel PRG.

El lenguaje C se traduce directamente a ensamblador. Y el ensamblador es el lenguaje más rápido (código máquina) :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
carlos vargas
Posts: 1421
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Post by carlos vargas »

Estimados

Y si esa informacion en Texto de alguna forma se puede convertir a una tabla dbf la cual podemos perfectamente maipular no seria mejor.

por ejemplo

21112007;01122007;31122007;20000000028;D;S;N;6,00;1,75;15;10
21112007;01122007;31122007;20000013677;D;S;N;6,00;1,75;15;10
21112007;01122007;31122007;20000091635;D;S;N;6,00;1,75;15;10
21112007;01122007;31122007;20000125327;C;S;N;6,00;1,75;15;10
21112007;01122007;31122007;20000188426;C;S;N;6,00;1,75;15;10
21112007;01122007;31122007;20000282465;D;S;N;0,00;0,00;01;01

se podria utilizar un COPY DELIMITED por ejemplo.

salu2
carlos vargas
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
Posts: 1421
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Post by carlos vargas »

Antonio

En XBase++ tienen un RDD que permite manipular Archivos delimitados como si de una tabla se tratase, usando USE, BROWSE, SKIP, GO.. Tec.

no se pudiera implementar algo similar en harbour.

NOTA, si pueden enviarme el txt comprimido podria intentar encontrar la forma.

karlos.vargas AT gmail.com

salu2
carlos vargas.
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Carlos,

Luis está buscando el sistema más rápido posible, ya que el fichero es muy grande.

En _ es donde hace falta el lenguaje C, ya que es sin duda, el más rápido de todos :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply