У меня есть несколько файлов базы данных DBF, которые я хотел бы преобразовать в CSV. Есть ли способ сделать это в Linux или в PHP?Преобразование DBF в CSV
Я нашел несколько методов для преобразования DBF, но они очень медленные.
У меня есть несколько файлов базы данных DBF, которые я хотел бы преобразовать в CSV. Есть ли способ сделать это в Linux или в PHP?Преобразование DBF в CSV
Я нашел несколько методов для преобразования DBF, но они очень медленные.
Измените переменную файлов на путь к вашим файлам DBF. Убедитесь, что расширение файла соответствует случаю ваших файлов.
set_time_limit(24192000);
ini_set('memory_limit', '-1');
$files = glob('/path/to/*.DBF');
foreach($files as $file)
{
echo "Processing: $file\n";
$fileParts = explode('/', $file);
$endPart = $fileParts[key(array_slice($fileParts, -1, 1, true))];
$csvFile = preg_replace('~\.[a-z]+$~i', '.csv', $endPart);
if(!$dbf = dbase_open($file, 0)) die("Could not connect to: $file");
$num_rec = dbase_numrecords($dbf);
$num_fields = dbase_numfields($dbf);
$fields = array();
$out = '';
for($i = 1; $i <= $num_rec; $i++)
{
$row = @dbase_get_record_with_names($dbf, $i);
$firstKey = key(array_slice($row, 0, 1, true));
foreach($row as $key => $val)
{
if($key == 'deleted') continue;
if($firstKey != $key) $out .= ';';
$out .= trim($val);
}
$out .= "\n";
}
file_put_contents($csvFile, $out);
}
Использование @ кода Kohjah, вот Обновление кода с использованием лучшего (ИМХО) fputcsv
подход:
// needs dbase php extension (http://php.net/manual/en/book.dbase.php)
function dbfToCsv($file)
{
$output_path = 'output' . DIRECTORY_SEPARATOR . 'path';
$path_parts = pathinfo($file);
$csvFile = path_parts['filename'] . '.csv';
$output_path_file = $output_path . DIRECTORY_SEPARATOR . $csvFile;
if (!$dbf = dbase_open($file, 0)) {
return false;
}
$num_rec = dbase_numrecords($dbf);
$fp = fopen($output_path_file, 'w');
for($i = 1; $i <= $num_rec; $i++) {
$row = dbase_get_record_with_names($dbf, $i);
if ($i == 1) {
//print header
fputcsv($fp, array_keys($row));
}
fputcsv($fp, $row);
}
fclose($fp);
}