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 instrucionesSQL
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.