hisamu / php-xbase
使用PHP解析 *.dbf, *.fpt 文件的简单解析器
2.2.0
2024-08-15 13:46 UTC
Requires
- php: >=7.1
- ext-iconv: *
Requires (Dev)
- phpunit/phpunit: ^7.0||^8.0||^9.0
README
一个用于处理类似 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 的专家,也不知道所有字段类型和版本的具体细节,因此库可能无法处理某些情况。如果您发现错误,请提交问题,并发送一个示例表格,以便我可以重现您的问题,我将尽力帮助。