Eliminar una línea en un archivo de texto e trabajar con la base de datos .dbf sin perder la rutina del programa con BITTEST como se muestra a continuación.

154 views
Skip to first unread message

Marcelo Sampaio

unread,
Feb 5, 2021, 10:38:55 AM2/5/21
to Comunidad de Visual Foxpro en Español
1 - Buenas tardes, tengo una rutina desarrollada por Víctor, quien me ayudó mucho y es partícipe de esta comunidad, ya que todavía soy un principiante en foxpro. En esta rutina, tomo la primera línea del archivo 1 y busco en todas las líneas del archivo 2, tanto en texto como para encontrar la cantidad deseada igual entre ellas. Lo que me gustaría hacer ahora es, cuando encuentre la línea con la cantidad deseada en el archivo 2, que registre lo que encontró en archivo 3, esto ya está hecho, pero ahora necesito la rutina para borrar esta línea encontrada del archivo 2, para que luego, al regresar al archivo 1 y tomar la segunda línea que contará en el archivo 2, no cuente esa misma línea ya grabada, ya que fue borrada previamente en la rutina.

2 - Trabajar con la base de datos .dbf sin perder la rutina del programa con BITTEST como se muestra a continuación.

Nota: Me gustaría que enseñara en la rutina cómo hacer estos cambios.

----------------------------------------LA RUTINA-----------------------------------------

CLEAR 
CLEAR ALL 
CLOSE ALL

#Define CUANTOS        15
#Define CUANTOS_OK     7

Local lcLin1 As String, ;
lcLin2 As String, ;
llT1 As Boolean, ;
lnArq1 As Number, ;
lnArq2 As Number, ;
lnArq3 As Number, ;
lnLin1 As Number, ;
lnLin2 As Number, ;
lnMatriz As Number, ;
lnNro As Number, ;
lnRepetidos As Number, ;
lnDistintos As Number, ;
lnSecFin As Number, ;
lnSecIni As Number, ;
lnValTmp As Number

lnSecIni = Seconds()

lnArq1 = Fopen("arquivo1.txt", 0)
lnArq2 = Fopen("arquivo2.txt", 0)

If File("arquivo3.txt")
Delete File arquivo3.txt
Endif
lnArq3 = Fcreate("arquivo3.txt", 0)

lnLin1 = 0
lnLin2 = 0

Do While Not Feof(m.lnArq1)
lnLin1 = m.lnLin1 + 1
vlin = TRANSFORM(lnLin1,'99999')
lcLin1 = Fgets(m.lnArq1)
lnMatriz = 0
For lnNro = 1 To CUANTOS
lnValTmp = Val(Substr(m.lcLin1, ((m.lnNro - 1) * 3) + 1, 3))
lnMatriz = m.lnMatriz + 2 ^ (m.lnValTmp - 1)
Endfor
llT1 = .T.
Do While Not Feof(m.lnArq2)
lnLin2 = m.lnLin2 + 1
lcLin2 = Fgets(m.lnArq2)
lnRepetidos = 0
lnDistintos = 0
For lnNro = 1 To CUANTOS
lnValTmp = Val(Substr(m.lcLin2, ((m.lnNro - 1) * 3) + 1, 3))
If Bittest(m.lnMatriz, m.lnValTmp - 1)
lnRepetidos = m.lnRepetidos + 1
Else
lnDistintos = m.lnDistintos + 1
If m.lnDistintos > (CUANTOS - CUANTOS_OK)
Exit
Endif
Endif
ENDFOR
If m.lnRepetidos >= CUANTOS_OK
If m.llT1
llT1 = .F.
Endif

Fputs(m.lnArq3, m.lcLin2)
                        ***************************** Grabado en archivo 3, ahora, elimine esa línea del archivo 2 para que las otras líneas del archivo 1 ya no la cuenten**********************
Endif
Enddo
Fseek(m.lnArq2, 0, 0)
Enddo

SET BELL TO ("c:\windows\media\Alarm01.wav")
?? CHR(7)
SET BELL TO

lnSecFin = Seconds()
Messagebox(Transform(m.lnSecFin - m.lnSecIni))

Fclose(m.lnArq1)
Fclose(m.lnArq2)
Fclose(m.lnArq3)

**************************Ahora, abajo, la misma rutina pero para la base de datos, que no tengo idea de cómo hacerlo*******************************

Víctor Hugo Espínola Domínguez

unread,
Feb 6, 2021, 3:08:39 PM2/6/21
to publice...@googlegroups.com
1) Creo que no existe comando para eliminar una lìnea de un archivo de texto, un método puede ser grabar en un auxiliar el bloque anterior a la línea y luego agregar el bloque posterior, con las funciones  STREXTRACT y STRTOFILE puedes implementar este algoritmo.

2) Para usar tablas en vez de textos debes mostrar las estructuras de las tablas.

Saludos,
Víctor.
Lambaré - Paraguay.



--
Visita el Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/df124fb2-35e0-46fe-9481-a6a4c81c6d7do%40googlegroups.com.

Marcelo Sampaio

unread,
Feb 8, 2021, 1:25:40 PM2/8/21
to Comunidad de Visual Foxpro en Español
Víctor, buenas tardes...
Víctor, busqué estos comandos y los encontré, traté de entenderlos pero no obtuve nada ... El ejemplo de FOX en sí es muy pobre. Podrías mostrarme cómo hacer esto en su rotina abajo?
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publice...@googlegroups.com.

Zarlu

unread,
Feb 8, 2021, 1:54:03 PM2/8/21
to Comunidad de Visual Foxpro en Español
Buenas tardes mklebers !

Entiendo que la información original está en un archivo de texto (archivo1) y al final de la rutina queda igual, sin cambios
Pregunto: al final de la rutina debes obtener los archivos  de texto archivo 2 y  archivo 3 con las condiciones que mencionas?
El archivo  archivo2 contendría al final sólo los que no están en  archivo 1?
El archivo  archivo 3 contendría al final los que están en  archivo 1 sin repetirse?

Haz considerado usar cursores temporales y al final armar los archivos de texto? Podría ser así?

Suerte
zarlu
Chetumal, Quintana Roo, México

Marcelo Sampaio

unread,
Feb 8, 2021, 2:39:31 PM2/8/21
to Comunidad de Visual Foxpro en Español


Em segunda-feira, 8 de fevereiro de 2021 15:54:03 UTC-3, Zarlu escreveu:
Buenas tardes mklebers !

Entiendo que la información original está en un archivo de texto (archivo1) y al final de la rutina queda igual, sin cambios
Eso es perfecto.

Pregunto: al final de la rutina debes obtener los archivos  de texto archivo 2 y  archivo 3 con las condiciones que mencionas?
No. El archivo 3 contendrá la información que se encuentra en el archivo 2 y las cantidades deseadas que se informaron tomando del archivo 1. Sin embargo, del archivo 1, al confrontarlo con el archivo 2 y encontrar la línea con la cantidad deseada, envía al archivo 3 tal cual ya hecho en la rutina, pero elimine esa línea que se encuentra en el archivo 2, evitando que esa línea eliminada sea encontrada nuevamente por el archivo 1 en el archivo 2, si es la misma cantidad. 
El archivo  archivo2 contendría al final sólo los que no están en  archivo 1?
No, el archivo 1 es solo para informar las cantidades y líneas que deben estar en el archivo 2 con las mismas cantidades, sin embargo, son líneas diferentes, pero que contendrán una cierta cantidad.
El archivo  archivo 3 contendría al final los que están en  archivo 1 sin repetirse?
No, el  archivo  archivo 3 contendría al final los que están en  archivo 2 sin repetirse.
Haz considerado usar cursores temporales y al final armar los archivos de texto? Podría ser así?
Se podrían usar cursores temporales, pero creo que la rutina sería muy lenta. Esta rutina la hizo Víctor, miembro de esta comunidad, y fue tremendamente rápida a través del comando BITTEST y porque son archivos .TXT 

Zarlu

unread,
Feb 8, 2021, 3:31:55 PM2/8/21
to Comunidad de Visual Foxpro en Español
Qué tal mklebers !

No le captó al cien.
Cuando dices ".. pero ahora necesito la rutina para borrar esta línea encontrada del archivo 2..." te refieres a borrarla físicamente del archivo o ignorarla?

Si la rutina que ya tienes te complace en velocidad y no requieres borrarla sólo ignórala. Es decir si la línea del archivo1 ya está en el archivo3 no hagas el proceso y salta a la siguiente línea del archivo1

Para la base de datos como te dijo el colega Víctor ayudaría conocer las estructura de las tablas.

Dices: " Se podrían usar cursores temporales, pero creo que la rutina sería muy lenta...." cuantos registros son??

zarlu
Chetumal, Quintana Roo, México

Víctor Hugo Espínola Domínguez

unread,
Feb 8, 2021, 3:32:17 PM2/8/21
to publice...@googlegroups.com
Adjunto el programa corregido para eliminar de arquivo2 las líneas ya procesadas. Pero el costo es que aumenta el tiempo de procesamiento debido al método de eliminación de la línea:
 
lcArquivo2 = Filetostr("arquivo2.txt")
lcBlock1   = Strextract(m.lcArquivo2, "", m.lcLin2)
lcBlock2   = Strextract(m.lcArquivo2, m.lcLin2, "")
lcBlock2   = Left(lcBlock2, Len(lcBlock2) - 2)
Fclose(m.lnArq2)
Strtofile(m.lcBlock1 + m.lcBlock2, "arquivo2.txt")

lnArq2 = Fopen("arquivo2.txt", 0)

Saludos,
Víctor.
Lambaré - Paraguay.


El vie, 5 de feb. de 2021 a la(s) 12:38, Marcelo Sampaio (mkle...@gmail.com) escribió:
--
Visita el Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
sampaio_bt2_new.PRG

Marcelo Sampaio

unread,
Feb 8, 2021, 4:08:13 PM2/8/21
to Comunidad de Visual Foxpro en Español
Gracias Zarlu. Revisaré la rutina que me envió Víctor y cualquier cosa diferente, postearé la estructura de la base de datos.

Marcelo Sampaio

unread,
Feb 8, 2021, 4:10:11 PM2/8/21
to Comunidad de Visual Foxpro en Español
Víctor, como siempre enseñándome algo diferente. Probaré la rutina y publicaré el envío. Gracias más una vez.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publice...@googlegroups.com.

Marcelo Sampaio

unread,
Feb 9, 2021, 7:45:22 AM2/9/21
to Comunidad de Visual Foxpro en Español
Buenos días Víctor, la rutina está de acuerdo, después de algunos ajustes. Tuve que eliminar los archivos para no tener la pregunta de superposición de archivos en la rutina. Muchas gracias.
Saludos.
Marcelo Sampaio
Brasil - São Paulo


Em segunda-feira, 8 de fevereiro de 2021 17:32:17 UTC-3, Víctor Hugo Espínola Domínguez escreveu:
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publice...@googlegroups.com.

Marcelo Sampaio

unread,
Feb 9, 2021, 8:05:25 AM2/9/21
to Comunidad de Visual Foxpro en Español
Víctor, al ejecutar en un archivo con más de 772 mil líneas, ocurrió un error, ver:




Em segunda-feira, 8 de fevereiro de 2021 17:32:17 UTC-3, Víctor Hugo Espínola Domínguez escreveu:
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publice...@googlegroups.com.

Víctor Hugo Espínola Domínguez

unread,
Feb 9, 2021, 3:57:55 PM2/9/21
to publice...@googlegroups.com
La frase de " te refieres a borrarla físicamente del archivo o ignorarla?" me hizo ver otro algoritmo: Si una línea no cumple la condición copiarla a otro archivo y la que cumple ignorarla, ese otro archivo sustituye al original en cada ciclo.

Prueba el adjunto, creo que debería funcionar con grandes archivos.

Saludos,
Víctor.
Lambaré - Paraguay.


Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/5bf26d29-6458-4a03-9a21-3fc865b7366eo%40googlegroups.com.
sampaio_bt32.PRG

Víctor Hugo Espínola Domínguez

unread,
Feb 9, 2021, 4:01:06 PM2/9/21
to publice...@googlegroups.com

Víctor Hugo Espínola Domínguez

Adjuntos17:57 (hace 0 minutos)
para publicesvfoxpro
La frase de Zarlu " te refieres a borrarla físicamente del archivo o ignorarla?" me hizo ver otro algoritmo: Si una línea no cumple la condición copiarla a otro archivo y la que cumple ignorarla, ese otro archivo sustituye al original en cada ciclo.

Prueba el adjunto, creo que debería funcionar con grandes archivos.

Saludos,
Víctor.
Lambaré - Paraguay.


El mar, 9 de feb. de 2021 a la(s) 10:05, Marcelo Sampaio (mkle...@gmail.com) escribió:
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/5bf26d29-6458-4a03-9a21-3fc865b7366eo%40googlegroups.com.
sampaio_bt32.PRG
Reply all
Reply to author
Forward
0 new messages