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 — データベースのヘッダ情報を得る
説明
array dbase_get_header_info
( int $dbase_identifier
)
指定したデータベースリンク ID のカラム構造についての情報を返します。
返り値
データベースの各カラムについての要素を格納した配列を返します。 配列の添字は 0 から始まります。
配列の各要素には、以下に述べるような形式の連想配列で カラムの情報が格納されます。
- name
- カラム名。
- type
- カラムのデータ型を可読形式(例: date、boolean など)で格納。
- length
- カラムのバイト数。
- precision
- カラムの数値の精度。
- format
- カラムに対して推奨される printf() でのフォーマット指定。
- offset
- 行の最初からのバイトオフセット。
ヘッダ情報が読み込めない場合には FALSE を返します。
例
例1 dBase データベースファイルの情報の表示
<?php
// dbase ファイルのパス
$db_path = "/tmp/test.dbf";
// dbase ファイルのオープン
$dbh = dbase_open($db_path, 0)
or die("Error! Could not open dbase database file '$db_path'.");
// カラム情報の取得
$column_info = dbase_get_header_info($dbh);
// 情報の表示
print_r($column_info);
?>
dbase_get_header_info
Marcos Peli
17-Apr-2009 10:13
17-Apr-2009 10:13
Eliovir
24-Jul-2008 09:04
24-Jul-2008 09:04
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
12-Sep-2006 07:58
12-Sep-2006 07:58
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)
