Acesso direto ao conteúdo
Logotipo Dicas-L, por Ricardo Burile

Busca

Visite também: Segurança Linux ·  UnderLinux ·  VivaOLinux ·  LinuxSecurity ·  NoticiasLinux ·  BR-Linux ·  SoftwareLivre.org ·  [mais]   
 

Você está aqui: Home  → Arquivo Dicas-L

 

Curso de Inglês Online

Assine a Lista Dicas-L

Receba diariamente por email as dicas
de informática publicadas neste site
Para se descadastrar, clique aqui.

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

Formato PDF
Newsfeed RSS
Formato para impressão
PDF RSS Imprimir

Referências Adicionais

Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.

Avalie esta dica

  • Currently 3.00/5
  • 1
  • 2
  • 3
  • 4
  • 5

Avaliação: 3.0 /5 (1664 votos)

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
Treinamentos, Consultorias e Soluçoes em TI. Baseados em softwares livres e padrões abertos para ambientes de missão crítica

Submarino.com.br

Programando o Android