você está aqui: Home  → Arquivo de Mensagens Curso Gratuito sobre Expressões Regulares, com o Prof.  Julio Neves

Exportando Banco de Dados DBF para MySQL

Colaboração: André Marques Saunite

Data de Publicação: 13 de Outubro de 2005

Algum tempo atrás comecei a trabalhar em uma pequena empresa que utilizava um programa de gerenciamento feito em Clipper, com banco de dados FoxBase, rodando num servidor linux, o sistema era muito bom, porém havia a necessidade de se alterar algumas coisas, principalmente na parte de geração de relatórios.

Como não tinha acesso ao código fonte, e a documentação sobre FoxBase é escassa, resolvi tentar exportar os dados para MySQL, depois de algumas perguntas para Ele (www.google.com <http://www.google.com>), achei um software livre para linux que fazia essa exportação ( http://www.anubisnet.de/products/dbf), efetuei a instalação:

tar xfvz dbf-<versao>.tar.gz
cd dbf-<versao>
make
su
make install

Exportei o dbf para um arquivo SQL sem problemas:

dbf --sql <arquivo-destino.sql> <arquivo-origem.dbf>

Porem na hora de importar o dado para mysql:

mysql -u root -p
<senha>
CREATE TABLE teste;
USE teste;
source <arquivo.sql>

Vários registros da tabela apresentaram erros ao tentar passar para o MySQL, analisando melhor os arquivos gerados pelo programa, percebi que algumas das linhas inseridas tinham erros de sintaxe que o MySQL não aceitava, então desenvolvi um pequeno script que (pelo menos no meu caso) consertou 100% das tabelas que não foram exportadas corretamente pelo programa.

Esse script lê a tabela passada como argumento, utiliza o dbf para importar os dados e resulta num arquivo .sql que pode ser facilmente importado pelo MySQL, segue abaixo o script:


#
# Descrição: Importa tabelas do banco de dados .DBF para .sql
# Dependencia: dbf (http://www.anubisnet.de/products/dbf)
# Nome: /usr/bin/dbf2sql
#
# Autor: André Marques Saunite
# e-mail: saunite [a] gmail dot com
#
# Última atualização: 04/08/2005
#

# Coloque aqui os diretórios corretos (sem "/" no final):

# Caminho onde serão copiados os arquivos .sql:
DBF2SQL_DIR='/home/dbf2sql'
# Caminho temporária que será criada e apagada:
DBF2SQL_TEMP_DIR='/home/dbf2sql/tmp'
# Caminho para o executavel do dbf
DBF_DIR='/usr/local/bin'
# DATABASE a ser utilizado
DATABASE='estoque'

if ! [ $# -lt 2 ]; then
mkdir $DBF2SQL_TEMP_DIR
NAME=$2;
DBF=$1;
rm $DBF_DIR/$NAME.sql -rf
$DBF_DIR/dbf --sql $DBF2SQL_TEMP_DIR/dbf2sql.SQL $DBF
cat $DBF2SQL_TEMP_DIR/dbf2sql.SQL | grep -v "^$" | grep -v "^'" | grep -v
"($" |grep -v "^--" | grep -v "^drop" >
$DBF2SQL_TEMP_DIR/dbf2sql.NOCREATESQL
grep "CREATE TABLE" $DBF2SQL_TEMP_DIR/dbf2sql.SQL >
$DBF2SQL_TEMP_DIR/dbf2sql.CREATESQL
cat $DBF2SQL_TEMP_DIR/dbf2sql.CREATESQL
$DBF2SQL_TEMP_DIR/dbf2sql.NOCREATESQL > $DBF2SQL_TEMP_DIR/dbf2sql.CLEANSQL

$DBF_DIR/dbf --csv $DBF2SQL_TEMP_DIR/dbf2sql.CSV $DBF
LINHAS=`cat $DBF2SQL_TEMP_DIR/dbf2sql.CSV | awk 'END {print NR}'`
LINHAS=`expr $LINHAS - 1`
tail -n $LINHAS $DBF2SQL_TEMP_DIR/dbf2sql.CSV >
$DBF2SQL_TEMP_DIR/dbf2sql.CSVLINES
cat $DBF2SQL_TEMP_DIR/dbf2sql.CSVLINES | sed s/^/"INSERT INTO $NAME VALUES
("/g | sed s/$/");"/g | sed s/",);"/",\"\");"/g >
$DBF2SQL_TEMP_DIR/dbf2sql.CLEANCSV
cat $DBF2SQL_TEMP_DIR/dbf2sql.CLEANSQL $DBF2SQL_TEMP_DIR/dbf2sql.CLEANCSV >
$DBF2SQL_TEMP_DIR/dbf2sql.JOIN
REPLACE=`echo $DBF2SQL_TEMP_DIR | sed s/\\\//\\\\\\\\\\\//g`
cat $DBF2SQL_TEMP_DIR/dbf2sql.JOIN | sed s/",,"/",\"\","/g | sed
s/",,"/",\"\","/g | sed s/"$REPLACE\/dbf2sql"/$NAME/g | sed
s/"\\\\"/"\\\\\\\\"/g | sed s/"(#"/"("/g | sed s/"\~"/"_"/g >
$DBF2SQL_TEMP_DIR/dbf2sql.BODY
echo "USE $DATABASE;" > $DBF2SQL_TEMP_DIR/dbf2sql.CAB

# Se o script for atualizar automaticamente o MySQL (comentário abaixo) e
ainda não existir a tabela criada, comente a linha abaixo;
echo "DROP TABLE $NAME;" >> $DBF2SQL_TEMP_DIR/dbf2sql.CAB

cat $DBF2SQL_TEMP_DIR/dbf2sql.CAB $DBF2SQL_TEMP_DIR/dbf2sql.BODY >
$DBF2SQL_DIR/$NAME.sql

# Caso queira que o script importe automaticamente a tabela para o MySQL
descomente a linha abaixo
# mysql --user=<usuário> --password=<senha> < $DBF2SQL_DIR/$NAME.sql
else
echo "Uso: $0 <arquivo-dbf> <nome-tabela>"
fi

rm $DBF2SQL_TEMP_DIR -rf

Caso seja necessária a importação de vários arquivos de uma vez pode-se usar o seguinte script, que converterá todos os arquivos .DBF da pasta atual para uma pasta SQL que será criada:

#
# Descrição: Script de apoio para dbf2sql
# Dependencia: dbf2sql, dbf (http://www.anubisnet.de/products/dbf)
# Nome: /usr/bin/all2sql
#
# Autor: André Marques Saunite
# e-mail: saunite [a] gmail dot com
#
# Última atualização: 04/08/2005
#

#!/bin/bash
echo "Criando pasta SQL"
mkdir SQL
for i in `ls *.DBF`; do
NOME=`echo "$i" | sed s/"\.DBF"/""/`
echo "Transformando Arquivo $i em ./SQL/$i.sql "
dbf2sql $i $NOME
done
echo "Movendo todos os arquivos .sql para ./SQL"
mv *.sql SQL

Esses pequenos scripts me ajudaram muito, o único problema que encontrei foi que o programa de conversão usado não tem suporte a tabelas .dbf que utilizam o campo memo, como no meu caso as tabelas desse tipo não eram importantes, consegui driblar esse problema.

Algumas das utilidades interessantes do programa de exportação de dbfs utilizado:

Exporta o banco de dados para MySQL

dbf --sql <arquivo-destino> <arquivo-origem>

Exporta o Banco de Dados para um Arquivo CSV (Comma Separated Values)

dbf --csv <arquivo-destino> <arquivo-origem>

Simplesmente mostra o conteúdo da tabela

dbf --view-info <arquiv.dbf>


Veja a relação completa dos artigos de André Marques Saunite