hisamu/php-xbase

使用PHP解析 *.dbf, *.fpt 文件的简单解析器

2.2.0 2024-08-15 13:46 UTC

README

Build Status Test Coverage Latest Stable Version Total Downloads License

一个用于处理类似 dBase 和 FoxPro 的 dbf 数据库的简单库。它是 Erwin Kooi 编写的 PHPXbase 类的移植版本,更新为符合 PSR-2 代码规范,并针对性能和解决原始代码中的一些问题进行了调整。

安装

您可以通过 Composer 安装它

$ composer require hisamu/php-xbase

示例用法

更多示例在 tests 文件夹中。

读取数据

use XBase\TableReader;

$table = new TableReader('test.dbf');

while ($record = $table->nextRecord()) {
    echo $record->get('my_column');
    //or
    echo $record->my_column;
}

如果数据库中的数据不是 UTF-8,您可以指定一个字符集来转换数据

use XBase\TableReader;

$table = new TableReader(
    'test.dbf',
    [
        'encoding' => 'cp1251'
    ]
);

还可以从专用文件中读取 Memo。只需确保存在与主数据库同名的 .fpt 文件。

性能

您可以将所需的列数组传递给构造函数,然后如果您的表中包含您不使用的列,则它们将不会被加载。这样,解析器可以运行得更快。

use XBase\TableReader;

$table = new TableReader(
    'test.dbf', 
    [
        'columns' => ['my_column', 'another_column']
    ]
);

while ($record = $table->nextRecord()) {
    echo $record->my_column;
    echo $record->another_column;
}

如果您已经知道列类型,也可以调用该字段的特定类型函数,这也会提高速度。

while ($record = $table->nextRecord()) {
    echo $record->get('my_column');
    echo $record->get('another_column');
}

编辑数据

要打开表格进行编辑,您必须使用 TableEditor 对象,如下例所示

use XBase\TableEditor;

$table = new TableEditor('test.dbf');

for ($i = 0; $i < 10; $i++) {
    $record = $table->nextRecord();
    
    $record->set('field', 'string');
    //or
    $record->field = 'string';

    $table->writeRecord();
}

$table
    ->save()
    ->close();

添加新记录

use XBase\TableEditor;

$table = new TableEditor(
    'file.dbf',
    [
        'editMode' => TableEditor::EDIT_MODE_CLONE, //default
    ]
);
$record = $table->appendRecord();
$record->set('name', 'test name');
$record->set('age', 20);

$table
    ->writeRecord()
    ->save()
    ->close();

删除记录

use XBase\TableEditor;

$table = new TableEditor('file.dbf');

while ($record = $table->nextRecord()) {
    if ($record->get('delete_this_row')) {
        $table->deleteRecord(); //mark record deleted
    }    
}

$table
    ->pack() //remove deleted rows
    ->save() //save changes
    ->close();

创建表格

要创建表格文件,您需要使用 TableCreator 对象。

use XBase\Enum\FieldType;
use XBase\Enum\TableType;
use XBase\Header\Column;
use XBase\Header\HeaderFactory;
use XBase\TableCreator;
use XBase\TableEditor;

// you can specify any other database version from TableType
$header = HeaderFactory::create(TableType::DBASE_III_PLUS_MEMO);
$filepath = '/path/to/new/file.dbf';

$tableCreator = new TableCreator($filepath, $header);
$tableCreator
    ->addColumn(new Column([
        'name'   => 'name',
        'type'   => FieldType::CHAR,
        'length' => 20,
    ]))
    ->addColumn(new Column([
        'name'   => 'birthday',
        'type'   => FieldType::DATE,
    ]))
    ->addColumn(new Column([
        'name'   => 'is_man',
        'type'   => FieldType::LOGICAL,
    ]))
    ->addColumn(new Column([
        'name'   => 'bio',
        'type'   => FieldType::MEMO,
    ]))
    ->addColumn(new Column([
        'name'         => 'money',
        'type'         => FieldType::NUMERIC,
        'length'       => 20,
        'decimalCount' => 4,
    ]))
    ->addColumn(new Column([
        'name'   => 'image',
        'type'   => FieldType::MEMO,
    ]))
    ->save(); //creates file

$table = new TableEditor($filepath);
//... add records 

故障排除

我不是 dBase 的专家,也不知道所有字段类型和版本的具体细节,因此库可能无法处理某些情况。如果您发现错误,请提交问题,并发送一个示例表格,以便我可以重现您的问题,我将尽力帮助。

有用链接

Xbase 文件格式描述

dBASE 7 文件结构

DBF 和 DBT/FPT 文件结构