[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Импорт dbf в Mysql через sql запросы
Strannik
Добрый день. Есть файл dbf. Мне нужно написать функцию импорта из этого файла в mysql через запросы sql.
подскажите как сделать(ранее делал связку csv + mysql, а dbf впервые приходится связывать)...



Спустя 2 часа, 26 минут, 4 секунды (12.05.2012 - 12:41) sergeiss написал(а):
У меня тоже была такая задача. Потратив много времени на геморрой с какой-то библиотекой ПХП для работы с DBF, я пришел к такой схеме. Прога на Си (Си++Билдер) "выливает" данные в CSV файл. После чего запускается скрипт на ПХП, который эти данные заливает в БД, одним блоком.
В моем случае БД - это Постгре, но это не принципиально. Заливать одним блоком можно и в Мускуле.

Спустя 2 часа, 47 минут, 22 секунды (12.05.2012 - 15:29) Strannik написал(а):
у меня случай след. dbf -дамп из 1С, иными прогами пользоваться не могу, только php (условия заказчика). подскажите есть ли библиотека?

Спустя 7 часов, 44 минуты, 59 секунд (12.05.2012 - 23:14) Strannik написал(а):
Нашел в источниках:

/*
* Part 2 code modified by Clint Christopher Canada from different public domain sources
* Part 1 code created by Clint Christopher Canada. BSD licensed.
*/

// This is Part I of the code

$tbl = "table to create";
$db_uname = 'mysql username';
$db_passwd = 'mysql password';
$db = 'database';
$conn = mysql_pconnect('localhost',$db_uname, $db_passwd);

// Path to dbase file
$db_path = ".DBF";

// Open dbase file
$dbh = dbase_open($db_path, 0)
or die("Error! Could not open dbase database file '$db_path'.");

// Get column information
$column_info = dbase_get_header_info($dbh);

// Display information
//print_r($column_info);


$line = array();

foreach($column_info as $col)
{
switch($col['type'])
{
case 'character':
$line[]= "`$col[name]` VARCHAR( $col[length] )";
break;
case 'number':
$line[]= "`$col[name]` FLOAT";
break;
case 'boolean':
$line[]= "`$col[name]` BOOL";
break;
case 'date':
$line[]= "`$col[name]` DATE";
break;
case 'memo':
$line[]= "`$col[name]` TEXT";
break;
}
}

$str = implode(",",$line);
$sql = "CREATE TABLE `$tbl` ( $str );";

mysql_select_db($db,$conn);

mysql_query($sql,$conn);
set_time_limit(0); // I added unlimited time limit here, because the records I imported were in the hundreds of thousands.

// This is part 2 of the code


import_dbf($db, $tbl, $db_path);

function import_dbf($db, $table, $dbf_file)
{
global $conn;
if (!$dbf = dbase_open ($dbf_file, 0)){ die("Could not open $dbf_file for import."); }
$num_rec = dbase_numrecords($dbf);
$num_fields = dbase_numfields($dbf);
$fields = array();

for ($i=1; $i<=$num_rec; $i++){
$row = @dbase_get_record_with_names($dbf,$i);
$q = "insert into $db.$table values (";
foreach ($row as $key => $val){
if ($key == 'deleted'){ continue; }
$q .= "'" . addslashes(trim($val)) . "',"; // Code modified to trim out whitespaces
}
if (isset($extra_col_val)){ $q .= "'$extra_col_val',"; }
$q = substr($q, 0, -1);
$q .= ')';
//if the query failed - go ahead and print a bunch of debug info
if (!$result = mysql_query($q, $conn)){
print (mysql_error() . " SQL: $q
\n");
print (substr_count($q, ',') + 1) . " Fields total.

"
;
$problem_q = explode(',', $q);
$q1 = "desc $db.$table";
$result1 = mysql_query($q1, $conn);
$columns = array();
$i = 1;
while ($row1 = mysql_fetch_assoc($result1)){
$columns[$i] = $row1['Field'];
$i++;
}
$i = 1;
foreach ($problem_q as $pq){
print "$i column: {$columns[$i]} data: $pq
\n";
$i++;
}
die();
}
}
}


?>


источник



Спустя 1 час, 22 минуты, 39 секунд (13.05.2012 - 00:36) sergeiss написал(а):
Strannik, ты знаешь... Когда-то я разбирался со структурой DBF файла, она не сложная. Но проблема в том, что мне надо было еще и данные выбирать. А вот со структурой индексов для DBF я ранее не разбирался, не знаю, как файл устроен smile.gif Может быть и не сложно. Мне лично проще было на Си сделать, т.к. ограничений никаких не было.

Спустя 48 минут (13.05.2012 - 01:24) Strannik написал(а):
sergeiss
я понимаю, но проблема в том, что у меня такая задача.
Если по хорошему - дать пользователю dbf2mysql и все, но так нельзя, нужно, чтобы он через скрипт обновлял базу, а основная проблема в том, что инфы мало, я пока скрипт нашел ушло 2 часа, а еще проверить его работу нужно(хотя отзывы хорошие).
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.