El ladrón de Ibertex
Descripción del contenido de la página
Programa en Clipper para extraer datos de Ibertex y crear con ellos una base de datos.
Esta es otra joya del baúl de los recuerdos. A comienzos de los noventa se popularizó en España la red Ibertex, análogo al Videotex francés, que permitía acceder con una computadora y un módem a páginas de información con un sistema de aspecto parecido al teletexto de la televisión.
Uno de los servicios que ofrecía información era la Cámara de Comercio. Como era tan laborioso pasar los datos de las empresas a un formato aprovechable, escribí este pequeño programa para automatizar el proceso. El programa de Investrónica que usaba para la conexión a Ibertex tenía una función para guardar en un fichero de texto las páginas visitadas. Mi programa exploraba ese archivo para extraer la información útil y crear con ella una base de datos limpia.
Como otros programas que escribí en aquella época, las «tripas» están en esperanto (nombres de funciones, variables, comentarios...) pero la interfaz de usuario está en castellano.
Código fuente
**************************************************************************
* El ladrón de Ibertex
*
*
* Copyright (C) 1993,1994 Marcos Cruz (http://programandala.net)
* Licencia/Permesilo/License: http://programandala.net/licencia
*
* versio 1993 02 22
* versio 1993 04 04
* - uzas fread anstataux memoread
* - ebligas elekti la devenon de la fajlo elektita
* versio 1993 04 05
* - la foiro-fako de IFEMA estas finita kaj funkcias bone
* versio 1994 07 31
* - sen espaj Clipper-tradukoj
*
#INCLUDE "fileio.ch"
&&#DEFINE provo
PUBLIC fajldeveno_k := "" // por la speco de fajlo
PUBLIC antauxa_linio_k := "" // kroma redonajxo el la FUNCTION tuja_datumo()
PUBLIC rikordoj_n := 0 // kalkulilo
WHILE .T.
CLS
? "************************"
? "* El ladrón de Ibertex *"
? "************************"
?
? "Por/Far:"
? "Marcos Cruz (http://programandala.net)"
?
? "Licencia: http://programandala.net/licencia"
?
? REPLICATE("_",80)
?
WHILE .T.
ACCEPT "Fichero VTX para convertir: " al fajlnomo_k
IF malplena(fajlnomo_k)
? "Adiós."
QUIT
ENDIF
IF fajlo(fajlnomo_k:=kunfinajxa(fajlnomo_k,"vtx"))
EXIT
ELSE
? "No existe el fichero",fajlnomo_k
ENDIF
END
WHILE .T.
? "¿De qué servicio de Ibertex IF ha extraído el fichero",fajlnomo_k+"?:"
?
? "De la Cámara de Comercio e Industria de Madrid:"
? " 1 = empresas seleccionadas por su epígrafe fiscal"
? "De IFEMA:"
? " 2 = expositores de una feria"
? " x = galerías de arte que han expuesto en ARCO"
? "De Fomento:"
?
?
ACCEPT "Número de la opción= " al fajldeveno_k
IF longo(fajldeveno_k)=1 kaj fajldeveno_k $ "12"
EXIT
ELSE
?
ENDIF
END
CLS
? "Trabajando..."
? "Construyendo una base de datos a partir de",fajlnomo_k
fajlnumero_n := FOPEN(fajlnomo_k)
rikordoj_n := 0
IF fajlnumero_n=-1
? "error de apertura del fichero"
ELSE
DO CASE
CASE fajldeveno_k="1"
ccim()
CASE fajldeveno_k="2"
standoj()
ENDCASE
FCLOSE(fajlnumero_n)
? "Número de fichas extraídas:",rikordoj_n,
? "Pulsa una tecla para seguir"
INKEY(0)
ENDIF
END
**************************************************************************
* Cámara de Comercio e Industria de Madrid
FUNCTION ccim()
* versio 1993 02 22
* versio 1993 04 04
IF .NOT. FILE("ccim.dbf")
CREATE ccim
APPEND BLANK
REPLACE;
Field_name WITH "NOMO",;
Field_type WITH "C",;
Field_len WITH 40,;
Field_dec WITH 0
APPEND BLANK
REPLACE;
Field_name WITH "ADRESO",;
Field_type WITH "C",;
Field_len WITH 35,;
Field_dec WITH 0
APPEND BLANK
REPLACE;
Field_name WITH "POSXTKODO",;
Field_type WITH "C",;
Field_len WITH 5,;
Field_dec WITH 0
APPEND BLANK
REPLACE;
Field_name WITH "URBO",;
Field_type WITH "C",;
Field_len WITH 20,;
Field_dec WITH 0
CLOSE
ENDIF
fajlnomo_k := senfinajxa(fajlnomo_k)
CREATE &fajlnomo_k FROM ccim
USE(fajlnomo_k)
WHILE (linio_k:=fajllinio(fajlnumero_n))#NIL
IF "fiscal" $ linio_k
// la vorto "fiscal" trovita en linio
fajllinio(fajlnumero_n) // for la tuja linio
IF fajllinio(fajlnumero_n)=chr(196)
// trovita komenco de rikordoj
kvinopo() // enlegu la kvin rikordojn
ENDIF
ENDIF
END
RETURN NIL
FUNCTION kvinopo()
* versio 1993 02 22
* versio 1993 03 03
* -forigas du unuaj karaktrojn el la nomo, kiuj foje
* estas neutila cifero
* legas 5 tujajn rikordojn el la VTX-teksto
LOCAL rikordo_n
LOCAL nomo_k
LOCAL adreso_k
FOR rikordo_n = 1 TO 5
nomo_k := tradukita(substr(fajllinio(fajlnumero_n),3))
adreso_k := tradukita(fajllinio(fajlnumero_n))
IF .NOT. malplena(nomo_k)
// estas io en la rikordo
@ 5,1
@ 5,1 say nomo_k
APPEND BLANK
REPLACE nomo WITH nomo_k
REPLACE adreso WITH left(adreso_k,len(adreso_k)-5)
REPLACE posxtkodo WITH right(adreso_k,5)
IF posxtkodo="280"
REPLACE urbo WITH "MADRID"
ENDIF
ENDIF
fajllinio(fajlnumero_n) // for la interlinio
NEXT
RETURN NIL
**************************************************************************
* IFEMA
FUNCTION standoj()
* versio 1993 04 04
LOCAL linio_k
IF .NOT. fajlo("stando.dbf")
kreu standoj
APPEND BLANK
REPLACE;
Field_name WITH "FOIRO",;
Field_type WITH "C",;
Field_len WITH 15,;
Field_dec WITH 0
APPEND BLANK
REPLACE;
Field_name WITH "STANDO",;
Field_type WITH "C",;
Field_len WITH 8,;
Field_dec WITH 0
APPEND BLANK
REPLACE;
Field_name WITH "FAKO",;
Field_type WITH "C",;
Field_len WITH 80,;
Field_dec WITH 0
APPEND BLANK
REPLACE;
Field_name WITH "NOMO",;
Field_type WITH "C",;
Field_len WITH 40,;
Field_dec WITH 0
APPEND BLANK
REPLACE;
Field_name WITH "ADRESO",;
Field_type WITH "C",;
Field_len WITH 35,;
Field_dec WITH 0
APPEND BLANK
REPLACE;
Field_name WITH "POSXTKODO",;
Field_type WITH "C",;
Field_len WITH 5,;
Field_dec WITH 0
APPEND BLANK
REPLACE;
Field_name WITH "URBO",;
Field_type WITH "C",;
Field_len WITH 30,;
Field_dec WITH 0
APPEND BLANK
REPLACE;
Field_name WITH "LANDO",;
Field_type WITH "C",;
Field_len WITH 15,;
Field_dec WITH 0
APPEND BLANK
REPLACE;
Field_name WITH "TELEFONO",;
Field_type WITH "C",;
Field_len WITH 20,;
Field_dec WITH 0
APPEND BLANK
REPLACE;
Field_name WITH "FAKSO",;
Field_type WITH "C",;
Field_len WITH 20,;
Field_dec WITH 0
APPEND BLANK
REPLACE;
Field_name WITH "PRODUKTOJ",;
Field_type WITH "C",;
Field_len WITH 80,;
Field_dec WITH 0
APPEND BLANK
REPLACE;
Field_name WITH "MARKOJ",;
Field_type WITH "C",;
Field_len WITH 80,;
Field_dec WITH 0
APPEND BLANK
REPLACE;
Field_name WITH "AGADO",;
Field_type WITH "C",;
Field_len WITH 80,;
Field_dec WITH 0
close
ENDIF
fajlnomo_k := senfinajxa(fajlnomo_k)
CREATE &fajlnomo_k FROM standoj
WHILE (linio_k:=fajllinio(fajlnumero_n))#nenio
#IFDEF provo
? "Ekzamenata linio:",linio_k
#ENDIF
IF linio_k="Feria"
#IFDEF provo
? "*************** datumoj trovitaj ***************"
#ENDIF
APPEND BLANK
REPLACE foiro WITH tradukita(tuja_datumo())
IF antauxa_linio_k="Stand"
REPLACE stando WITH tradukita(tuja_datumo())
ENDIF
IF antauxa_linio_k="Sectores"
REPLACE fako WITH tradukita(tuja_datumo())
ENDIF
IF antauxa_linio_k="Expositor"
REPLACE nomo WITH tradukita(tuja_datumo())
ENDIF
IF antauxa_linio_k="Direccion"
REPLACE adreso WITH tradukita(tuja_datumo())
ENDIF
IF antauxa_linio_k="Poblacion"
REPLACE urbo WITH tradukita(tuja_datumo())
ENDIF
IF antauxa_linio_k="Pais"
REPLACE lando WITH tradukita(tuja_datumo())
ENDIF
IF antauxa_linio_k="Telefono"
REPLACE telefono WITH tradukita(tuja_datumo())
ENDIF
IF antauxa_linio_k="Fax"
REPLACE fakso WITH tradukita(tuja_datumo())
ENDIF
IF antauxa_linio_k="Productos"
REPLACE produktoj WITH tradukita(tuja_datumo())
ENDIF
IF antauxa_linio_k="Marcas"
REPLACE markoj WITH tradukita(tuja_datumo())
ENDIF
IF antauxa_linio_k="Actividad"
REPLACE agado WITH tradukita(tuja_datumo())
ENDIF
ENDIF
END
RETURN NIL
FUNCTION tuja_datumo()
* versio 1993 04 04
* versio 1993 04 05
* legas tujajn linioj gxis nova rikorderlimo, kaj
* kunigas ilin en unu linion
LOCAL linio_k
LOCAL liniacxo_n
LOCAL rikordero_k := ""
WHILE .T.
IF (linio_k := fajllinio(fajlnumero_n))=NIL
EXIT
ELSE
DO CASE
CASE linio_k=chr(196)
// trovita END de la nuna pagxo
// necesas salti sur la novan pagxon
#ifdef provo
? "Sercxe la tujan pagxon..."
#endif
WHILE .T.
linio_k:=fajllinio(fajlnumero_n)
IF linio_k=NIL aux "■■■├──" $ linio_k
// trovita fajlfino aux nova pagxo
// do ne plu sercxi
EXIT
ENDIF
END
// trovigxis fajlfino aux nova pagxo
IF linio_k=NIL
// eliro pro fajlfino
// do tute eliri por reveni
#ifdef provo
? "FAJLFINO TROVITA DUM ALIPAGXIGO" &&
#endif
EXIT
ENDIF
#ifdef provo
? "NOVA PAGXO TROVITA" &&
#endif
CASE maldekstra(linio_k,5)==space(5)
// trovita linio apartenanta al la rikordero
rikordero_k := rikordero_k+" "+alltrim(linio_k)
OTHERWISE
// trovita titolo de nova rikordero
IF linio_k="Feria"
// temas pri la unua linio de rikordero
// do necesas retroiri por poste retrovi
FSEEK(fajlnumero_n,-longo(linio_k)-2,FS_RELATIVE)
ENDIF
EXIT
ENDCASE
ENDIF
END
antauxa_linio_k := linio_k
#IFDEF provo
? "RIKORDO:",rikordero_k &&
#ENDIF
RETURN alltrim(rikordero_k)
**************************************************************************
* Diversaj
FUNCTION tradukita(teksto_k)
* versio 1993 02 22
* versio 1993 04 04
* - tradukas laux la fajldeveno
* tradukas VTX-linion laux la fajldeveno
* teksto_k = linio
* redonas tekston tradukitan
DO CASE
CASE fajldeveno_k="1"
teksto_k := strtran(teksto_k,"/","Ñ")
teksto_k := strtran(teksto_k,"#","Ñ")
teksto_k := strtran(teksto_k,"ö","Ñ")
CASE fajldeveno_k="2"
teksto_k := strtran(teksto_k,"\","Ñ")
teksto_k := strtran(teksto_k,"|","ñ")
ENDCASE
RETURN ALLTRIM(teksto_k)
FUNCTION senfinajxa(fajlnomo_k)
* versio 1993 02 22
* forigas la triliteran finajxon el fajlnomo, kaj la punkton
* fajlnomo_k = fajlnomo
* redonas la novan nomon
RETURN;
IIF(;
IIF(;
LEN(fajlnomo_k)>4;
,RIGHT(fajlnomo_k,4)=".";
,.F.;
);
,LEFT(fajlnomo_k,longo(fajlnomo_k)-4);
,fajlnomo_k;
)
FUNCTION kunfinajxa(fajlnomo_k,finajxo_k)
* versio 1993 02 22
* aldonas finajxon al fajlnomo, IF necese
* fajlnomo_k = fajlnomo
* finajxo_k = finajxo
* redonas la novan nomon
LOCAL punktloko_n := rat(".",fajlnomo_k) // plej dekstra punkto
IF punktloko_n=0
// ne estas punkto en la fajlnomo
fajlnomo_k := fajlnomo_k+"."+finajxo_k
ELSE
// estas punkto en la fajlnomo
IF punktloko_n=longo(fajlnomo_k)
// la punkto estas lastloke
fajlnomo_k := fajlnomo_k+finajxo_k
ELSE
// la punkto ne estas lastloke
// gxi povas esti finajxa aux el antauxa fajlujnomo
&& lasi tiel provizore
ENDIF
ENDIF
RETURN fajlnomo_k
FUNCTION fajllinio(fajlnumero_n)
* versio 1993 04 04
* redonas tekstlinion el la fajlo celata de fajlnumero_n
LOCAL legitaj_n := 0
LOCAL eraro_l := .F.
LOCAL linilongo_n := 40
LOCAL karaktro_k := space(1)
LOCAL linio_k := ""
LOCAL linifino_k := space(1)
WHILE .T.
legitaj_n:=fread(fajlnumero_n,@karaktro_k,1)
//? legitaj_n,"octetos leídos"
IF legitaj_n#1
eraro_l := .T.
EXIT
ELSE
IF asc(karaktro_k)=13
// liniekfino trovita
FREAD(fajlnumero_n,@linifino_k,1) // finforigi gxin
EXIT
ELSE
linio_k := linio_k+karaktro_k
ENDIF
ENDIF
END
/*
@ 20,0
IF .NOT. eraro_l
@ 20,0 SAY linio_k
INKEY(0)
ENDIF */
RETURN IIF(eraro_l,NIL,linio_k)
/*
TEXT
El ladrón de la Cámara de Comercio
----------------------------------
Instrucciones (primera parte)
1) Conéctese con el servicio de videotex de la Cámara de Comercio
por medio del programa Inves300.
2) Active con Ctrl F5 la grabación de la sesión en un fichero con la
extensión SES. Este fichero almacenará todos los códigos de
videotex recibidos a través de la línea telefónica.
Es útil elegir como nombre de fichero el número de licencia fiscal
que IF va a explorar en los diferentes municipios.
3) Elija las condiciones deseadas (licencia fiscal, municipio y/o
código postal) y vea una tras otra las páginas de las fichas escogidas.
Deje completarse cada página en pantalla antes de pulsar la tecla
4) Desactive con Ctrl F5 la grabación de la sesión.
5) Si quiere robar datos de otra licencia fiscal, vuelva al paso 2.
6) Desconéctese de la línea telefónica con la tecla Esc.
...tecla...
TEXTEND
INKEY(0)
TEXT
Instrucciones (segunda parte)
7) Active con Ctrl F5 la visualización de la sesión grabada anteriormente,
eligiendo la opción F para imprimir la sesión en un fichero
con extensión VTX. Elija como nombre de fichero el mismo
usado para registrar la sesión, es decir, el epígrafe de licencia fiscal.
8) Ahora puede dejar solo el ordenador, reproduciendo la sesión y grabándola
en un fichero de texto, o bien puede acelerar el cambio de páginas
pulsando la barra espaciadora (deje que cada página IF complete
totalmente antes de pasar a la siguiente).
9) Si grabó más sesiones, vuelva al paso 7.
Los ficheros con extensión VTX creados de esta manera contienen en forma
de texto todos los datos de cada pantalla de una sesión de videotex. Pueden
verse con cualquier tratamiento de textos.
Este programa extrae de forma inteligente todos los nombres, direcciones
y códigos postales del texto, y crea con ellos un fichero estándar de
base de datos con extensión DBF.
La única limitación es que el fichero VTX no exceda de 65536 octetos.
...tecla...
TEXTEND
INKEY()
CLS
*/
Descargas
- Código fuente para descargar: ladron.prg (15.89 KiB)
- Todos los ficheros, con algunas bases de datos de ejemplo: ladron.tar.gz (22.97 KiB)