За последние 24 часа нас посетили 33229 программистов и 1755 роботов. Сейчас ищут 923 программиста ...

ИЗ DBF в MYSQL

Тема в разделе "PHP и базы данных", создана пользователем Genrih, 26 мар 2015.

  1. Genrih

    Genrih Активный пользователь

    С нами с:
    18 дек 2011
    Сообщения:
    16
    Симпатии:
    0
    Проблемы такая нужно информацию из *.DBF перекидывать в базу MYSQL. *.DBF может содержать от 100 тыс до 8 мил. записей.
    Нашел код программы http://stackoverflow.com/questions/14270236/php-script-to-convert-dbf-files-to-mysql или http://www.coolcomputing.com/article.php?sid=4628. При перекидывании 500 тыс записей затрачивается около часа.
    Помогите как можно ускорить этот процесс.
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Если это надо сделать один раз, то пофигу на время, я считаю. Главное чтобы получилось. ;)
    А если регулярно, то что-то надо менять. Попробовать уйти от построчной обработки к "оптовой". Приходят в голову два варианта:

    1. Подключить и DBF и MySQL через ODBC и сделать всё в один запрос типа INSERT INTO… SELECT…
    вроде такое возможно. Помнится когда работал с MS Access там были подобные кейсы.

    2. Найти способ выгрузки в формат csv. Его можно очень быстро импортировать в MySQL командой LOAD DATA INFILE.

    Есть еще почти безумная идея №3: т.к. DBF это формат с записями фиксированной длины, грузить в промежуточную таблицу и разбирать строки средствами MySQL: http://stackoverflow.com/questions/11461790/loading-fixed-w ... into-mysql
     
  3. Genrih

    Genrih Активный пользователь

    С нами с:
    18 дек 2011
    Сообщения:
    16
    Симпатии:
    0
    Проблема в том, что данные будут загружаться раз в неделю, и DBF файлов будет около 10 штук, мне нужно написать программу так, что бы люди, которые вообще не знают Access и что такое ODBC, могли одним нажатием на кнопку получить нужную информацию с этих файлов за минимальное время. Конвертировать их через сторонние программы не хочется вообще ни как, тем более обучать людей это делать.

    Нашел функцию mysqli_multi_query, но проблема в том, что она отправляет все нужные запросы на сервер, но сервер обрабатывает их как-то долго т.е. загружает в таблицу по одной записи и это тоже довольно долго.

    Если использовать третий вариант. то потом я потеряю время на trim или substr пока буду группировать нужную информацию.
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Интересно как люди видят не то, что им показываешь )))

    Я вообще не аксесс советовал, а технологию доступа к данным. Аксесс только для примера, он тоже имеет доступ к ODBC. Так что ты (а не какие-то люди) мог бы с его помощью что-то побыстрому проверить. В случае успеха можно было бы попробовать написать автоматический импорт через ODBC-connector. Не у "людей", а там, куда попадают их файлы. ;)

    Расскажи откуда берутся эти DBF. Это формат выгрузки из программы? Есть там другие варианты?

    Добавлено спустя 6 минут 19 секунд:
    Кстати, прошу только понять меня правильно, возможность выполнить SQL-запрос к источнику ODBC есть практически на любой машине с виндой. Сам аксесс для этого не нужен. Называется технология поразному: MDAC, MS Jet, DAO: мелкософт никак не мог остановиться с маркетинговыми терминами.
    На *nix машинах аксесса нет. Но коннекторы ODBC реализованы практически везде. Так что идея может выстрелить. Но для переноса данных все-таки больше подходит CSV или XML.
     
  5. Genrih

    Genrih Активный пользователь

    С нами с:
    18 дек 2011
    Сообщения:
    16
    Симпатии:
    0
    Файлы будут присылать сторонние организации с формате DBF или TXT (чаще присылают в DBF). Я не хочу заниматься импортом этих файлов на сервер. если использовать dbForge Studio for MySQL импорт занимает 1-2 минуты. вот я и ищу, не ужели нет готового кода программы для импорта DBF файлов за это-же время.
    Автоматический импорт писать на чем??? на PHP
    Писать отдельную программу на другом языке с использованием ODBC-connector, как то не вдохновляет. Если использовать MYSql-connect и Access время импорта тоже занимает кучу времени.
    Почему я все время дергаю Access, потому, что есть написанная прога на нем. писал не я, мне нужно ее переделать на сетевую, что бы она работала через инет.
    Если использовать PHP и ODBC-connector ??? не знаю не пробовал. сейчас порою инет
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Ещё можно через Autoit запускать dbForge Studio for MySQL автоматически.
    Это если остальное не получится сделать.
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Я не знаю всей кухни, конечно, но если вариант TXT (csv?) есть, то это же здорово всё упрощает и ускоряет! Это будут десятки секунд вместо часов. load data жеж!
    Будь я админом этой системы, наладил бы импорт из текста и выдал указание клиентам: присылать в тектовом виде и только в нем.
     
  8. Genrih

    Genrih Активный пользователь

    С нами с:
    18 дек 2011
    Сообщения:
    16
    Симпатии:
    0
    Сейчас проведу эксперимент с load data ! и отпишусь.

    А пока возникла идея как написать SQL запрос на PHP для вставки массива данных например insert into $db.$table values ( массив данных )
     
  9. Genrih

    Genrih Активный пользователь

    С нами с:
    18 дек 2011
    Сообщения:
    16
    Симпатии:
    0
    Спасибо за load data ! , да действительно за 20-30 сек загружает нужную информацию.
    Но все же, не ужели нет аналогичной функции, которая бы также загружала информацию с DBF Файлов.

    И еще один вопрос Как в таком коде программы можно отследить процент загрузки информации
    Код (Text):
    1.  
    2. $query = "load data infile '../mtest/de_by.txt'  into table de_by fields terminated by '|'  lines terminated by '\n' ";
    3. if (!$mysqli->query($query)) {
    4.     printf("Errormessage: %s\n", $mysqli->error);
    5. }
    что бы работник не думал, что зависла программа, пока он будет загружать информацию.
    Заранее большое спасибо.
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    ( пусть я некропостер ) Никак в этом случае не получить прогресс выполнения. Я в подобных случаях просто не заставляю человека ждать. Он загрузил файл и получил сообщение, что задание встало в очередь. Через некоторое негарантированное время он сможет увидеть результаты своего "труда". Пока может потыкать "обновить" чтобы узнать статус.

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