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>
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários