Page 1 of 1

Buscar en archivo txt

Posted: Wed Nov 28, 2007 12:58 am
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

Posted: Wed Nov 28, 2007 8:09 am
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

Posted: Wed Nov 28, 2007 10:07 am
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

Posted: Sun Dec 02, 2007 11:12 am
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()

Posted: Sun Dec 02, 2007 12:06 pm
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

Posted: Mon Dec 03, 2007 4:02 pm
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)

Posted: Tue Dec 04, 2007 3:48 pm
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

Posted: Tue Dec 04, 2007 6:09 pm
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) :-)

Posted: Wed Dec 05, 2007 2:48 pm
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

Posted: Wed Dec 05, 2007 2:53 pm
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.

Posted: Wed Dec 05, 2007 3:04 pm
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 :-)