Search
Write a publication
Pull to refresh

Извлечение данных из 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-движка Access-a без офиса у меня ставило в тупик автоматическую систему обновление Microsoft в тчетной попытке обновить несуществующий офис.

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

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

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

Успехов в использовании!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.