不幸的是,dbase 函数没有编译到我的商业服务器的 php 中,我需要读取一些 shape 文件中的地理数据,这些数据包含在 dbfs 中。
所以这也许可以帮助其他一些人
<?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)) { $buf = fread($fdbf,32);
if (substr($buf,0,1)==chr(13)) {$goon=false;} 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); 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/>';} fclose($fdbf); }
?>
此函数只是使用 echo 和 json_encode 倾倒整个文件,因此您可以根据自己的需要调整它... (例如,随机访问只需更改 seek 为:fseek($fdbf, $header['FirstRecord']+1 +($header['RecordLength']* $desiredrecord0based); 删除 for 循环并返回 $record
此函数不进行任何类型转换,但如果需要处理日期或整理数字等,它会提取类型。
因此,它快速而简陋,但可能对某些人有用,并说明了 unpack 的强大功能。
Erich