De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
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:
dbf --sql <arquivo-destino> <arquivo-origem>
dbf --csv <arquivo-destino> <arquivo-origem>
dbf --view-info <arquiv.dbf>