Дневник Шестеро Михаила

Apr. 2nd, 2014

06:45 pm - Извлечение данных из MS Access-баз простыми, кросс-платформенными и бесплатными способами

По работе мне частенько случается обмениваться большими (иногда многогигабайтовыми) объёмами табличных данных. Такие таблицы обычно приходят в понятном простому пользователю формате — MS Access. Сейчас я расскажу, как можно эффективно извлекать данные из этих файлов для того что бы пустить их в обработку или, например, ввести их в MySQL.

Проблема тут в том, что MS Access — проприетарная программа, которую надо бы покупать, да и не всегда она просто бывает под рукой на конкретной машине, да и сделана под Windows (а я часто на Linux-е). Если архив с базой приходит от коллеги уже на сервер хостинга, приходилось сначала скачивать его на рабочий компьютер, извлекать данные, а потом обычно запаковывать и закачивать извлечённые данные обратно. Кроме этого, на рабочей локальной машине открывать предельно объёмные базы MS Access им самим только лишь для извлечения данных не оптимально по расходу ресурсов оперативной памяти и времени.

Первое на что натыкаешься на этом пути — утилиты mdbtools. Они действительно очень помогли мне. Но к сожалению, у них есть недостатки. Во-первых, не работают с новым форматом accdb. Во-вторых, проблемы с кривыми названиями сущностей в базе (имена таблиц, колонок с пробелами, русскими буквами итд). Добиться ведь, что бы имена колонок были сразу какие удобно для обработки от поставщиков практически не возможно.

Тогда я использовал ODBC. Драйвера для работы с Access-базами (как mdb так и accdb) можно бесплатно взять с сайта Microsoft. Для выгрузки в TSV («значения разделённые табуляцией» — простой универсальный формат, который понимют и офисные программы и MySQL) я написал простейшую программу на Qt.

Этот способ мне то же изрядно помог, однако я столкнулся с такими недостатками:

1) По мере чтения таблицы резервируется оперативная память. Для работы с действительно большими таблицами нужно иметь не менее 4 Gb свободной оперативной памяти.

2) Пожалуй самое страшное — если ресурсов не хвататет, программа прерывает работу без какого-либо сообщения или даже признака ошибки. Иногда экспортируются не все строки таблицы, но ещё хуже, когда в выходных данных пропадают (без какого либо обращающего на себя сообщения!) значения в определённых столбцах.

3) На 64-битную систему ставятся 64-битовые ODBC-драйвера, а что бы с ними работать, программа должна быть также откомпилирована как 64-битовый исполняемый модуль. А для того что бы его сделать понадобится 64-битовый Qt и компилятор…

4) Присутствие в системе JET-движка MS Access-a без MS Office у меня ставит в тупик автоматическую систему обновление Microsoft, тщетно пытающуюся обновить несуществующий Office.

5) Под Linux-ом мне не удалось этим воспользоваться. Хотя в принципе это возможно. Linux-овые ODBC-драйвера для работы с Access-базами платные, но под эмулятором Wine должно быть можно задействовать native-ODBC-драйвера (сделанные для Windows). Инструкции как это сделать есть в Интернете. Но мне не удалось: поддержка этого процесса «из коробки» в новых версиях Ubuntu, очевидно, утратилась. И «подгонять напильником» там, видимо, придётся не мало! Кстати, кому удалось использовать nativeODBC для доступа к Access-файлам через Wine под Ubuntu 12 илм 13 — отпишитесь!

Я уж подумал, ничего лучше не будет — формат то «проприетарный». Но в августе прошлого 2013-го года появилась бесплатная библиоткека Jackcess 2 (см. jackcess.sourceforge.net ), написанная на Java, которая позволяет легко и просто работать с Access-файлами, причём как старыми mdb, так и новыми accdb. Таким образом я не только элементарно самостоятельно сделал конвертер из Access в TSV но и получил его кроссплатформенным — ведь это Java. Теперь пользуюсь им и радуюсь.

Исходники и бинарники конвертеров я выложил для скачки здесь:
netdbview.com/accdb

Успехов в использовании!

Tags: , , , , , , , ,
Current Mood: [mood icon] satisfied