você está aqui: Home  → Arquivo de Mensagens

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

 

 

Opinião dos Leitores

Silvio Rubens Meira Prado
20 Dez 2010, 00:44
André,

Meu caso é semelhante ao descrito por você acima. Banco de dados em dBase e programa de gerenciamento escrito em Clipper.
Finalidade: gerenciamento de processos judiciais (de uso próprio, meu e de meu sócio).
O nó: os campos 'memo' são importantes, pois trazem um histórico de cada ação/cliente, em texto livre.
Estamos abraçando o Ubuntu. Já conseguimos rodar quase tudo feito para PC em Linux.
Até esse programa de gerenciamento consigo rodar, numa janela de DosBox. Fica lento, mas roda.
Nosso desejo é deletar de vez a partição ntfs (o que só conseguiremos após o Firefox ou outro navegador para Linux ser 'aceito' pelos internet banking's).
Você tem alguma dica para importação/exportação dos dados, sem perder os campos 'memo'? Com os SGBD nativos/ compatíveis (MySQL, Kexi) não consegui.

Obrigado,

Silvio
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script