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.

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>

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


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