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.

Etiquetas:

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