由於客戶的資料是很舊的伺服器產出的 FoxPro dbf 檔案,要在 Linux 環境下透過 PHP 讀取古老的 FoxPro dbf 檔案,我一開始真的丈二金剛摸不著頭緒,要嘛透過 Linux 轉檔轉成 csv 再透過 PHP 讀出來存到 MySQL,不然就是找套件,試遍各種方法,找了幾個套件,有些 dbf 套件對於 memo 檔案讀取似乎不甚理想,讀不出資料,不然就是讀出一堆亂碼,終於找到一個可以正確運作的套件。
nchizhov/inok-dbf
PHP 使用範例
<?php
require '../common/vendor/autoload.php';
use Inok\Dbf;
$dbfFile = 'samplefile.DBF';//主檔案
$fptFile = 'sampefile.FPT'; //memo 檔案
if(file_exists($dbfFile) && file_exists($fptFile)){
$dbftable = new \Inok\Dbf\Table($dbfFile,866); //default charset: 866
$memo = new \Inok\Dbf\Memo($fptFile);
$headers=$dbftable->getHeaders();
$columns=$dbftable->getColumns();
$data = $dbftable->getData();
$records = new \Inok\Dbf\Records($data, 866 , $headers, $columns);
$c = 0;
while ($Record = $records->nextRecord()) {
$column1 = $Record['column1'];; //欄位一
$column2 = $Record['column2']; //欄位二
$column3 = $Record['column3']; //欄位三
$content = $Record['content']; //memo內的資料
$content = iconv('big-5','utf-8//IGNORE', $content);
$c++;
}
$dbftable->close(); //關閉檔案
}
}
由於客戶的 memo 裡面有特殊造字導致讀資料時造成整個欄位資料無法轉成 utf-8 該欄位變成空資料,在使用 iconv() 轉碼時需要增加 //IGNORE 參數才能讀出其他字或者直接使用 mb_convert_encoding()來把BIG-5轉換成UTF-8,但該字附近三個字都顯示成亂碼狀態,但至少可以讀出其他資料。
$content = iconv('big-5','utf-8//IGNORE', $content);
$content = mb_convert_encoding($content, 'utf-8', 'big-5');