Buscar en archivo txt
Buscar en archivo txt
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
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
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
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()
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()
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
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:
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
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)
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)
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
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
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
- carlos vargas
- Posts: 1421
- Joined: Tue Oct 11, 2005 5:01 pm
- Location: Nicaragua
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
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)
Carlos Vargas
Desde Managua, Nicaragua (CA)
- carlos vargas
- Posts: 1421
- Joined: Tue Oct 11, 2005 5:01 pm
- Location: Nicaragua
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.
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)
Carlos Vargas
Desde Managua, Nicaragua (CA)
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact: