IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Конвертация DBF в MySQL
Shaman
сообщение 16.1.2010, 09:55
Сообщение #1





Группа: Модераторы
Регистрация: 1.12.2005
Из: OnLine
Пользователь №: 6 823



изначальная задача написать аналог dbf2mysql (Linux)
Код
<?php
# создание таблицы MySQL по образу и подобию DBF файла;
# ожидаемый параметр - имя DBF файла;
# возвращает строку;
function createtable($file) {
  if ($openfile = @dbase_open($file, 0)) {
    $dbfhead = dbase_get_header_info($openfile);
    $count = count($dbfhead);
    for ($i=0; $i < $count; $i++) {
      $mysql[$i] = $dbfhead[$i]["name"];
      $length = $dbfhead[$i]['length'];
      $precision = $dbfhead[$i]["precision"];
      # переводим тип поля из формата DBF в MySQL;
      # тут записаны не все типы полей существующие в DBF;
      switch ($dbfhead[$i]["type"]) {
        case "number":
         $mysql[$i] .= ($precision == 0)? " INT" : " FLOAT";
        break;
        case "character":
         $mysql[$i] .= " VARCHAR";
        break;
        case "date":
         $mysql[$i] .= " DATE";
        break;
       }
      $mysql[$i] .= "(".$length;
      $mysql[$i] .= ($precision == 0)? "" : ",".$precision;
      $mysql[$i] .= ")";
      $mysql[$i] .= ($i == $count-1)? "" : ",";
      # объединяем полученный массив в строку запроса MySQL;
      $querystr = "(";
      $querystr .= implode(" ", $mysql);
      $querystr .= ")";
     }
    return $querystr;
   }
  else return false;
}

# функция загрузки данных из DBF в MySQL;
# ожидаемые параметры имя файла и размер блока (сколько строк за 1 запрос будет загружено в MySQL);
# возвращает массив;
function load_data($file, $block) {
  if ($openfile = @dbase_open($file, 0)) {
    $countrec = dbase_numrecords($openfile);
    #$countfields = dbase_numfields($openfile);
    #echo "Записей в файле: ".$countrec . "<br>";
    #echo "Полей в строке " . $countfields . "<br>";
    $count = $countrec;
    $countdiv = (int)($count / $block);
    $countmod = (int)($count % $block);
    #echo $countdiv . " блоков по {$block} строк<br>";
    #echo "Последний блок {$countmod} строк<br>";
    for ($a=1,$i=0; $a <= $count; $i++) {
      # пока счетчик блоков не превышает количество целых блоков, размер блока остается равным заданному;
      # иначе значение счетчика приравнивается к количеству оставшихся записей (неполный блок);
      $block = ($i < $countdiv)? $block : $countmod;
      for ($b=0; $b < $block; $b++,$a++) {
        $row = dbase_get_record_with_names($openfile, $a);
        # удаляем поле с признаком deleted иначе будет не красиво - несоответствие;
        # количества колонок в таблице MySQL и числа загружаемых значений;
        unset($row['deleted']);
        foreach ($row as $key => $value) {
          $value = iconv("CP866", "UTF-8", $value);
          $value = trim($value);
          $row[$key] = htmlspecialchars($value, ENT_QUOTES, "UTF-8");
         }
        # объединяем массив в строку;
        $str[$b] = "(";
        $str[$b] .= implode(", ", $row);
        $str[$b] .= ")";
        $str[$b] .= ($b == $block-1)? "" : ",";
       }
      # формируем массив строк для возврата из функции;
      # одна строка для одного запроса в MySQL;
      # длинна каждой строки определяется размером блока переданного функции;
      $data[] = implode(" ", $str);
      unset($str);
     }
    dbase_close($openfile);
    return $data;
   }
  else return false;
}
$file = "WAY.DBF";
$block = 10;
echo "<pre>";
print_r(createtable($file));
echo "<br>";
print_r(load_data($file, $block));
echo "</pre>";
?>

чот у меня дурацкое чувство что я перемудрил с циклами в функции загрузки данных, может как-то проще можно это сделать?
вместо вывода массива с данными лучше будет отправлять запрос непосредственно в БД, иначе на больших dbf'ах памяти много отожрется, или я ошибаюсь?
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Arty V
сообщение 17.1.2010, 22:44
Сообщение #2





Группа: Модераторы
Регистрация: 11.5.2006
Пользователь №: 11 779



Завязывай с велосипедостроением и ещё дополнительно узнай про phpdoc
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Shaman
сообщение 18.1.2010, 02:15
Сообщение #3





Группа: Модераторы
Регистрация: 1.12.2005
Из: OnLine
Пользователь №: 6 823



по сути вопроса есть что написать?
содрать чужой код проще некуда, мне для учебы это требуется.

Сообщение отредактировал Shaman - 18.1.2010, 03:03
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Arty V
сообщение 25.1.2010, 12:29
Сообщение #4





Группа: Модераторы
Регистрация: 11.5.2006
Пользователь №: 11 779



Не стал разбираться ибо нечитабельно и про учёбу ты не говорил : )

В таком случае предлагаю не сдирать чужой код, а посомтреть как у людей сделано и сделать лучше
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Shaman
сообщение 25.1.2010, 21:55
Сообщение #5





Группа: Модераторы
Регистрация: 1.12.2005
Из: OnLine
Пользователь №: 6 823



ну если бы хотел содрать чужой код или надо было срочно сдавать какой-либо проект сюда точно не стал писать.
у людей посмотрел, в обход модуля dbase можно файл разобрать получится более универсальное средство (правда придется потерять в производительности т.к. парсить будем через пхп), но пока некогда разбираться со структурой dbf и вообще некогда, сессия началась.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия Сейчас: 25.8.2019, 01:12
Блог КАБiNET