Creative Commons License
Excepto donde se indique otra cosa, todo el contenido de este lugar está bajo una licencia de Creative Commons.
Taquiones > diario > 2008 > 02 > 8 > Ecoembes y linux

Ecoembes y linux

Ahora tenemos ya la declaración de envases anterior, y pretendo incorporarla a nuestra base de datos de alguna manera para poder manipularla mejor.

El archivo fuente es de tipo .mdb y en GNU/Linux se puede manipular hasta cierto punto con el paquete mdbtools que incluye un puñado de útiles.

Lo primero es obtener la estructura SQL para incorporarla a nuestro servidor:

$ mdb-schema -S ECO13148.mdb postgres > ecoembes.sql

Lo anterior extrae la estructura de tablas, limpia los nombres de los identificadores (aunque no del todo) y crea un archivo fuente SQL compatible con PostgreSQL.

Dicho fuente incluye un par de detalles molestos: la inclusión de sentencias de borrado de tablais y ciertos nombres de columnas completamente numéricos:

DROP TABLE Cliente;
CREATE TABLE Cliente
(
        901                     Bool,
        902                     Bool,
        903                     Bool,
        904                     Bool,
        Direccion               Char (100),
        CodEmpresa              Char (5),
        Nombre                  Char (50),

Para subsanarlo empleamos Perl de esta forma:

$ mdb-schema -S ECO13148.mdb postgres | \
    perl -p -e 's{^DROP.*$}{}xms;' -e 's{(\s+)(90\d)}{$1N_$2}xms' \
    > ecoembes.sql

De tal manera que lo anterior queda así

CREATE TABLE Cliente
(
        N_901                   Bool,
        N_902                   Bool,
        N_903                   Bool,
        N_904                   Bool,
        Direccion                       Char (100),
        CodEmpresa                      Char (5),

y ya tenemos un archivo SQL con el que crear una base de datos en PostgreSQL.

Después necesitamos cargar los datos, para lo cual usamos el programa mdb-export que inicialmente produce archivos en formato --csv--, pero que también puede crear sentencias SQL que insertan datos en las tablas.

Como mdb-export trabaja con una tabla a la vez podemos automatizar el proceso con un poco de bash:

$ for tabla in `mdb-tables -1 data/ECO13148.mdb` 
> do
> mdb-export -q"'" -R";\n" -I data/ECO13148.mdb $tabla >> carga.sql
> done

El parámetro -R le indica que añada el valor como delimitador de filas, y en mis pruebas he comprobado que mejor así, porque las instruciones SQL terminan con un punto y coma y las líneas en sí con un salto de línea.

Por su parte el parámetro -q indica qué usar para delimitar campos de tipo texto, que en el caso de PostgreSQL deberán ser comillas simples.

Antes de pasar el archivo a PostgreSQL debemos cambiar los nombres de las columnas que antes eran únicamente números; como ya sabemos que la tabla es la que contiene los datos del cliente, y no hay más código por ahora que los referencie, le aplicamos un filtro vía Perl de esta manera:

$ perl -p -e 's{(90\d)}{N_$1}gmxs if /^INSERT.*\sCliente\s/' < carga.sql > datos-ecoembes.sql

Los procesos anteriores, con algunos retoques, los he automatizado mediante un programa para obtener el esquema, y otro para volcar los datos. Ambos generan fuentes SQL que luego es cuestión de enviar al servidor.