Um dos principais problemas era a flata desta função nas versões PHP<5.0
O Script abaixo "contorna" o problema , e gera uma "pseudo-cabeçario" baseado no próprio conteúdo do arquivo DBF
Óbvio informar que se o arquivo DBF a ser submetido ao script estiver vazio , ou com poucos elementos ou linhas , ou ainda , se estes não representarem o conteudo com fidegnidade , ou seja , com muitos campos NULLs , o script podera não funcionar a contento com relação ao resultado desejado.
Utilizei por muito tempo o script abaixo como alternativa para a ausência da função dbase-get-header-info em versões PHP < 5.0 na confecção de cabeçarios e posterior transformação de arquivo DBF p/ MYSQL
<?php
// parametros iniciais
// Path - caminho para arquivo dbf a ser aberto
$diretorio_open = 'dbf/';
// Arquivo a ser aberto e explorado
$file = 'arquivo.dbf';
$con = dbase_open($diretorio_open.$file,0) or die('Erro na Conexão com o arquivo DBF');
// PHP>5.0 - usa função dbase_get_header_info para ler cabeçario
// PHP<5.0 - Simula a leitura através do conteudo do próprio arquivo
if(function_exists(dbase_get_header_info))
{$estrutura_arquivo = dbase_get_header_info($con);}
else
{$estrutura_arquivo = alternative_dbase_get_header_info($con);}
// imprime o header do arquivo
print_r($estrutura_arquivo);
// ---------------------------------------------
// função alternativa
function alternative_dbase_get_header_info($con)
{
//Pega o num. de linhas
$rows = dbase_numrecords($con);
//faz o loop percorrendo todas as linhas e carrega a variável $registro com os dados
for($i=1;$i<=$rows;$i++)
{
//Pega a linha do arquivo DBF e coloca como array
$registro = dbase_get_record_with_names($con,$i);
$y=0;
// Mostra as Chaves e os valores do array
foreach ($registro as $chave => $valor)
{
// pega as chaves (field - Coluna) só se for a primeira vez
if($i==1)
{$estrutura_arquivo[$y]['name'] = $chave;}
// finalmente pega o tipo , o comprimento e a precisão no mesmo padrão que dbase_get_header_info
if( ( ( ( @checkdate(substr($valor,4,2),substr($valor,-2),substr($valor,0,4)) ) && (strlen(trim($valor))==8) ) || (strlen(trim($valor))==0) ) && $chave != 'deleted') // testa se é data checkdate(MM,DD,AA)
{
if(!isset($estrutura_arquivo[$y]['type']))
{
$estrutura_arquivo[$y]['type'] = 'date';
$estrutura_arquivo[$y]['length'] = 8;
$estrutura_arquivo[$y]['precision'] = '0';
}
$e_data = TRUE;
}
if(is_numeric(trim($valor)) && strstr($valor, '.'))
{
$estrutura_arquivo[$y]['type'] = 'number';
if($estrutura_arquivo[$y]['length'] < strlen(trim($valor)))
{$estrutura_arquivo[$y]['length'] = strlen(trim($valor));}
if($estrutura_arquivo[$y]['precision'] < strlen(strstr(trim($valor),'.'))-1)
{$estrutura_arquivo [$y]['precision'] = strlen(strstr(trim($valor),'.'))-1;}
}
if(is_numeric(trim($valor)) && !strstr($valor, '.') && !$e_data && $estrutura_arquivo[$y]['precision'] < 1 && $estrutura_arquivo[$y]['type'] != 'character')
{
$estrutura_arquivo[$y]['type'] = 'number';
if($estrutura_arquivo[$y]['length'] < strlen(trim($valor)))
{$estrutura_arquivo[$y]['length'] = strlen(trim($valor));}
$estrutura_arquivo [$y]['precision'] = '0';
}
if( strlen($valor)>10 || (!is_numeric(trim($valor)) && strlen(trim($valor))!=0) )
{
$estrutura_arquivo[$y]['type'] = 'character';
if($estrutura_arquivo[$y]['length'] < strlen($valor))
{$estrutura_arquivo[$y]['length'] = strlen($valor);}
$estrutura_arquivo [$y]['precision'] = '0';
}
$e_data = FALSE;
$y+=1;
}
}
return(estrutura_arquivo);
}
?>
dbase_get_header_info
(PHP 5)
dbase_get_header_info — Ottenere le informazioni di intestazione di un database dBase
Descrizione
array dbase_get_header_info
( int
$dbase_identifier
)
Restituisce informazioni sulla struttura delle colonne del database referenziato da
dbase_identifier. Per ogni colonna del database,
esiste un valore specificato in un array ad indice numerico. L'indice dell'array inizia
da 0. Ogni elemento dell'array contiene un array associativo di informazioni sulle colonne.
Se l'informazione dell'header dell'array non può esssere letta, viene
restituito, FALSE .
Gli elementi dell'array sono:
- nome
- Il nome della colonna
- tipo
- Il nome del tipo di colonna del dBase riconoscibile dall'utente (es. data, boolean, etc)
- lunghezza
- Il numero di bytes che la colonna può contenere
- precisione
- Il numero di cifre della precisione decimale della colonna
- formato
- Un formato di printf() suggerito, specifico per la colonna
- offset (scostamento)
- L'offest, in byte, della colonna dall'inizio riga
Example #1 Mostra le informazioni dell'header di un file di database in formato dBase
<?php
// Path to dbase file
$db_path = "/tmp/test.dbf";
// Open dbase file
$dbh = dbase_open($db_path)
or die("Errore! Il file di database dBase non può essere aperto '$db_path'.");
// Get column information
$column_info = dbase_get_header_info($dbh);
// Display information
print_r($column_info);
?>
Marcos Peli ¶
4 years ago
Eliovir ¶
4 years ago
As of PHP 5.2.6, it seems that the type F (Float) is supported ( ext/dbase/dbase.c +713 ), with a length of 20 characters.
http://www.dbase.com/KnowledgeBase/int/db7_file_fmt.htm precises : Number stored as a string, right justified, and padded with blanks to the width of the field
christoph dot eck at bluewin dot ch ¶
6 years ago
Field Types
*********
Not all field types of DBase are supported. Look below for the internal field type definitions of PHP 5.1.x.
The storage symbols of DBase are C (stands for character), D (date) , I (integer), N (number), L (boolean), M (memo). All other symbols like B, @, l, +, F, O and G are defined as unknown.
Sources
*********
http://www.dbase.com/KnowledgeBase/int/db7_file_fmt.htm
PHP-Source-5.1.6 ext/dbase/dbase.c (line 786)
