Unfortunately the dbase functions are not compiled into my commercial server's php and I needed to read some geo data in shape files, which include data in dbfs.
So maybe this will help some others:
<?php
function echo_dbf($dbfname) {
$fdbf = fopen($dbfname,'r');
$fields = array();
$buf = fread($fdbf,32);
$header=unpack( "VRecordCount/vFirstRecord/vRecordLength", substr($buf,4,8));
echo 'Header: '.json_encode($header).'<br/>';
$goon = true;
$unpackString='';
while ($goon && !feof($fdbf)) { // read fields:
$buf = fread($fdbf,32);
if (substr($buf,0,1)==chr(13)) {$goon=false;} // end of field list
else {
$field=unpack( "a11fieldname/A1fieldtype/Voffset/Cfieldlen/Cfielddec", substr($buf,0,18));
echo 'Field: '.json_encode($field).'<br/>';
$unpackString.="A$field[fieldlen]$field[fieldname]/";
array_push($fields, $field);}}
fseek($fdbf, $header['FirstRecord']+1); // move back to the start of the first record (after the field definitions)
for ($i=1; $i<=$header['RecordCount']; $i++) {
$buf = fread($fdbf,$header['RecordLength']);
$record=unpack($unpackString,$buf);
echo 'record: '.json_encode($record).'<br/>';
echo $i.$buf.'<br/>';} //raw record
fclose($fdbf); }
?>
This function simply dumps an entire file using echo and json_encode, so you can tweak it to your own needs... (eg random access would just be a matter of changing the seek to : fseek($fdbf, $header['FirstRecord']+1 +($header['RecordLength']* $desiredrecord0based); removing the for loop and returning $record
This function doesn't do any type conversion, but it does extract the type if you need to play with dates, or tidy up the numbers etc.
So quick and dirty but maybe of use to somebody and illustrates the power of unpack.
Erich
dBase
- Introdução
- Instalação/Configuração
- Constantes pré-definidas
- Funções da dBase
- dbase_add_record — Adiciona um registro ao banco de dados
- dbase_close — Fecha um banco de dados
- dbase_create — Cria um banco de dados
- dbase_delete_record — Exclui um registro do banco de dados
- dbase_get_header_info — Obtém as informações do cabeçalho do banco de dados
- dbase_get_record_with_names — Obtém um registro do banco de dados como uma matriz associativa.
- dbase_get_record — Obtém um registro do banco de dados como uma matriz indexada
- dbase_numfields — Obtém o número de campos em um banco de dados
- dbase_numrecords — Obtém o número de registros no banco de dados
- dbase_open — Abre um banco de dados
- dbase_pack — Apaga permanentemente os registros do banco de dados dBase
- dbase_replace_record — Substitui um registro no banco de dados
dBase
Anonymous
01-Aug-2009 04:51
01-Aug-2009 04:51
