• Home
  • Palestras
  • Artigos
  • Livros

Convertendo DBF para SQL (DBF2SQL)

08/09/2008  Ler e Comentar

Há muitos anos atrás eu precisava converter diversos bancos de dados no foramato DBF para o formato SQL. Naquela época eu tinha desenvolvido uma ferramenta simples, a qual estava guardada naquelas pastas do computador que já chegam a ter pó de tanto tempo que não são visitadas.
Apesar de não utilizar mais esta ferramenta, sei que no Brasil existe muito programa feito em clipper, eu mesmo desenvolvi vários na década de 90. Muitos ainda estão ativos, mas uma hora irão migrar. E neste caso, se alguém precisar extrair as informações, coloco aqui um programinha simples que lê o arquivo .DBF e gera os SQL necessários para importá-lo em uma base de dados relacional.
Ao rodar o programa pela linha de comando, o mesmo irá indicar como proceder com a conversão: php dbf2sql <dbfile> <tablename> > output.sql



<?
if (count($argv) != 3)
{
    echo 
"#####################################################\n";
    echo 
"# dbf2sql : Converts DBF files to SQL instructions  #\n";
    echo 
"# sintax:                                           #\n";
    echo 
"#   php dbf2sql <dbfile> <tablename> > output.sql   #\n";
    echo 
"#                                                   #\n";
    echo 
"#   author : Pablo Dall'Oglio <pablo at php.net>    #\n";
    echo 
"#####################################################\n";
    die;
}

if (!
function_exists('dbase_open'))
{
    die(
"DBF support (--enable-dbase) is not enabled");
}

dbf2sql($argv[1], $argv[2]);


/* function dbf2sql
 * Converts a DBF file into SQL instructions
 * @dbffile    = DBF file name
 * @tablename  = Target table name
 */
function dbf2sql($dbffile, $tablename)
{
    
# Opens Dbase and SQLite files
    
$dbf = @dbase_open($dbffile, 0);
    
$pg_types['memo']      = 'text';
    
$pg_types['character'] = 'varchar';
    
$pg_types['number']    = 'float';
    
$pg_types['date']      = 'date';
    
    if (
$dbf)
    {
        
# Get Number or records and columns info
        
$num_records = dbase_numrecords($dbf);
        
$columns     = dbase_get_header_info($dbf);
        
        
# Create the SQLite table
        
$sql = "create table $tablename (";
        foreach (
$columns as $column)
        {
            
$name = $column['name'];
            
$type = $pg_types[$column['type']];
            
$len  = $column['length'];
            if (
$type == 'character')
            {
                
$type.="($len)";
            }
            
$sql .= "$name $type,";
        }
        
$sql = substr($sql,0,-1) . ')';
        echo 
"$sql;\n";
        
        
        
# Loop the Dbase records
        
for($index=1; $index <= $num_records; $index ++)
        {
            
# Get one record
            
$record = dbase_get_record($dbf, $index); // get the actual record
            # Ignore deleted fields
            
if ($record["deleted"] != "1")
            {
                
# Insert the record
                
$query = "insert into $tablename values(";
                foreach (
$record as $key=>$field)
                {
                    if (
$key!=='deleted')
                    {
                        
$field = str_replace("'", "\'", $field);
                        
$field = trim($field);
                        
$query .= "'$field',";
                    }
                }
                
$query = substr($query,0,-1) . ')';
                echo 
"$query;\n";
            }
        }
    }
    else
    {
        die(
"Cannot open DBF file");
    }
    return 
true;
}
?>




Comentários

  Uma pequena adaptação 

#####################################################################
# dbf2sql: Converts DBF files to SQL instructions #
# #
# author: Pablo Dall'Oglio #
# http://www.pablo.blog.br/63 #
# #
# adaptation: Lúcio Zanette Figueredo #
# http://luciozanette.com #
# #
# sintax: #
# php dbf2sql > output.sql #
# #
# example: #
# php dbf2sql Equipe.dbf depara equipe > equipe.sql #
# #
# sql output format : #
# USE depara; #
# DROP equipe IF EXISTS; #
# CREATE TABLE equipe ( #
# `id` int(11) NOT NULL auto_increment, #
# fieldname type (length field) #
# ... #
# PRIMARY KEY (`id`); #
# INSERT INTO equipe (fields name) VALUES(fields values); #
# ... #
#####################################################################
if (count($argv) != 4)
{
echo "USE -> php dbf2sql > output.sql\n" .
"databasename is used in sql sintax {USE databasename} for import sqlfile";
die;
}

if (!function_exists('dbase_open'))
{
die("DBF support (--enable-dbase) is not enabled");
}

dbf2sql($argv[1], $argv[2], $argv[3]);

function dbf2sql($dbffile, $database, $tablename)
{

$tablename = strtolower($tablename);

# Opens Dbase and SQLite files
$dbf = @dbase_open($dbffile, 0);
$pg_types['memo'] = 'text';
$pg_types['character'] = 'varchar';
$pg_types['number'] = 'float';
$pg_types['date'] = 'date';

if ($dbf)
{
# Get Number or records and columns info
$num_records = dbase_numrecords($dbf);
$columns = dbase_get_header_info($dbf);

# Create the SQLite table
$sql = "USE $database;\n";
$sql .= "DROP TABLE IF EXISTS $tablename;\n";
$sql .= "CREATE TABLE $tablename (\n";
$sql .= "`id` int(11) NOT NULL auto_increment,\n";

$campos = '(';

foreach ($columns as $column)
{
$name = strtolower($column['name']);
$type = $pg_types[$column['type']];
$len = $column['length'];

if ($type == 'varchar')
{
$type.="($len)";
}
$campos .= $name.',';
$sql .= "`$name` $type,\n";
}
$campos = substr($campos,0,-1) . ')';
$sql .= "PRIMARY KEY (`id`)\n";
$sql = substr($sql,0,-1) . ')';
echo "$sql;\n";


# Loop the Dbase records
for($index=1; $index <= $num_records; $index ++)
{
# Get one record
$record = dbase_get_record($dbf, $index); // get the actual record
# Ignore deleted fields
if ($record["deleted"] != "1")
{
# Insert the record
$query = "INSERT INTO $tablename $campos VALUES(";
foreach ($record as $key=>$field)
{
if ($key!=='deleted')
{
$field = str_replace("'", "\'", $field);
$field = trim($field);
$query .= "'$field',";
}
}
$query = substr($query,0,-1) . ')';
echo "$query;\n";
}
}
}
else
{
die("Cannot open DBF file");
}
return true;
}
?>

  Enviado por Lúcio Zanette Figueredo em 2009-07-01  

  Ótimo script 

Muito bom script , estou fazendo alguns trabalhos baseado na ideia geral , eu possuo o livro PHP com orientação a objetos e achei interessante descobrir que é do mesmo autor do script; Abraços.

  Enviado por Manuel NT em 2009-10-03  

  Modificação no script 

Fiz uma pequena modificação no seu script para utilizar o primeiro campo da tabela como chave primaria em vez de usar um id auto increment; Tambem criei um script em shell que da um ls em uma pasta contendo todos os .DBF e converte automaticamente usando seu db2sql, o script da um ls no diretorio e chama o comando php db2sql.php xxxx com cada um dos arquivos encontrados, foi bem util para uma conversão em lote que fiz aqui com mais de 100 arquivos .dbf , segue o db2sql.php modificado para utilizar como chave o 1º campo de cada tabela , após a importação eu faço um ajuste para criar as chaves estrangeiras manualmente, mas ja me tirou um grande trabalho:

#####################################################################
# dbf2sql: Converts DBF files to SQL instructions #
# #
# author: Pablo Dall'Oglio #
# http://www.pablo.blog.br/63 #
# #
# adaptation: Lúcio Zanette Figueredo #
# http://luciozanette.com #
# #
# example: #
# php dbf2sql Equipe.dbf nomedobanco nomedatabela > nomedatabela.sql #
# #
# sql output format : #
# USE nomedobanco; #
# DROP nomedatabela IF EXISTS; #
# CREATE TABLE nomedatabela ( #
# fieldname type (length field) #
# ... #
# PRIMARY KEY (`fieldname`); #
# INSERT INTO equipe (fields name) VALUES(fields values); #
# ... #
#####################################################################
if (count($argv) != 4)
{
echo "USE -> php dbf2sql > output.sql\n" .
"databasename is used in sql sintax {USE databasename} for import sqlfile";
die;
}

if (!function_exists('dbase_open'))
{
die("DBF support (--enable-dbase) is not enabled");
}

dbf2sql($argv[1], $argv[2], $argv[3]);

function dbf2sql($dbffile, $database, $tablename)
{

$tablename = strtolower($tablename);

# Opens Dbase and SQLite files
$dbf = @dbase_open($dbffile, 0);
$pg_types['memo'] = 'text';
$pg_types['character'] = 'varchar';
$pg_types['number'] = 'float';
$pg_types['date'] = 'date';

if ($dbf)
{
# Get Number or records and columns info
$num_records = dbase_numrecords($dbf);
$columns = dbase_get_header_info($dbf);

# Create the SQLite table
$sql = "USE $database;\n";
$sql .= "DROP TABLE IF EXISTS $tablename;\n";
$sql .= "CREATE TABLE $tablename (\n";
//$sql .= "`id` int(11) NOT NULL auto_increment,\n";

$campos = '(';
//linha adicionada
$i = 0 ;
foreach ($columns as $column)
{
$name = strtolower($column['name']);
$type = $pg_types[$column['type']];
$len = $column['length'];

//2 linhas addicionadas
if ($i == 0) $key = $name;
$i++;
if ($type == 'varchar')
{
$type.="($len)";
}
$campos .= $name.',';
$sql .= "`$name` $type,\n";
}
$campos = substr($campos,0,-1) . ')';
//$sql .= "PRIMARY KEY (`id`)\n";
$sql .= "PRIMARY KEY (`$key`)\n";

$sql = substr($sql,0,-1) . ')';
echo "$sql;\n";


# Loop the Dbase records
for($index=1; $index <= $num_records; $index ++)
{
# Get one record
$record = dbase_get_record($dbf, $index); // get the actual record
# Ignore deleted fields
if ($record["deleted"] != "1")
{
# Insert the record
$query = "INSERT INTO $tablename $campos VALUES(";
foreach ($record as $key=>$field)
{
if ($key!=='deleted')
{
$field = str_replace("'", "\'", $field);
$field = trim($field);
$query .= "'$field',";
}
}
$query = substr($query,0,-1) . ')';
echo "$query;\n";
}
}
}
else
{
die("Cannot open DBF file");
}
return true;
}
?>

  Enviado por Manuel NT em 2009-10-13  

  Dúvida / erro  

ao executar a rotina, é gerado o arquivo output, mas gera com a seguinte mensagem: DBF support (--enable-dbase) is not enabled, o que posso fazer para dar certo?

Obrigado,
Ricardo

  Enviado por Ricardo em 2009-12-27  

  RE: Dúvida / erro 

Olá Ricardo,

O seu PHP não possui suporte ao DBASE. Para isso, deve adicionar a extensão do PHP que adiciona as funções do dbase. www.php.net/dbase

abraço,
Pablo

  Enviado por Pablo em 2010-03-17  



Adicionar Comentário
 Nome  
 Email  
 Título  
 Comentário  

Livros



  • Outros

    • Galeria de Fotos
    • Posts no Codare

    Arquivo

    • 2010
    • 2009
    • 2008
    • 2007
    • 2006
    • 2005
    • 2004
  • Google

    Blogroll

    • Adler Medrado
    • Aurélio Jargas
    • Andrei Zmievski
    • Eduardo Maçan
    • Efetividade
    • Er Galvão
    • Joel on Software
    • Marcelio Leal
    • Martin Fowler
    • Miguel de Icasa
    • Newton Wagner
    • Rafael Dohms
    • Rasmus Lerdorf
    • Sérgio Crespo
    • Timoty Ney

    Posts Aleatórios

    • Gerando Thumbs em PHP
    • Sintaxe do Vim no Ubuntu
    • Agata/GNUTeca em Goias
    • Passeio nas Missões
    • GNUTeca no Rio
    • Curso de Marc21
    • Escritório de nerd imitando de executivo
    • II Forum Gnome
    • Implantação do GNUTeca em Ivoti
    • Canon SX100 - Sem comparação
    • Itararé :: Fafit/Facit
    • 6o. Fórum Internacional de Software Livre
    • Convertendo DBF para SQL (DBF2SQL)
    • Rodando o Windows XP no Ubuntu 7.10
    • Relato da PHP Conference
    • Chegaram os kazoos
    • Nova versão do Agata Report
    • PHPConference 2011
    • Usando o SQLite
    • Casamento
 
Designed by Wolfgang Bartelme Designed by Wolfgang Bartelme

© 2006 Wordpress Themes | Theme (Not so) Fresh
XHTML CSS