CITKIT.ru - свободные мысли о свободном софте
Деловая газета CitCity.ru Библиотека CITForum.ru Форумы Курилка
Каталог софта Движение Open Source Дискуссионный клуб Дистрибутивы Окружение Приложения Заметки Разное
20.02.2017

Последние комментарии

ОСТОРОЖНО: ВИНДОФИЛИЯ! (2250)
24 December, 22:53
Kubuntu Feisty (15)
24 December, 18:42
Один на один с Windows XP (3758)
24 December, 11:46

Каталог софта

Статьи

Дискуссионный клуб
Linux в школе
Open Source и деньги
Open Source и жизнь
Windows vs Linux
Копирайт
Кто такие анонимусы
Лицензии
Нетбуки
Нужен ли русский Linux?
Пользователи
Дистрибутивы
Идеология
Выбор дистрибутива
Archlinux & CRUX
Debian
Fedora
Gentoo
LFS
LiveCD
Mandriva
OpenSolaris
Slackware
Zenwalk
Другие линуксы
BSD
MINIX
Движение Open Source
История
Классика жанра
Окружение
shell
Библиотеки UI
Графические среды
Шрифты
Приложения
Безопасность
Управление пакетами
Разное
Linuxformat. Колонки Алексея Федорчука
Заметки
Блогометки
Файловые системы
Заметки о ядре

Заметки :: Блогометки :: Приложения

Из dbf в MySQL и обратно. Производственная драма с прологом, но без эпилога

http://strannick.blogspot.com/

На новой работе большая часть времени уходит на работу с базой данных. База большая, хаотичная и в целом — внушает ужас. Увы, отнюдь не объёмами, но скорее качеством данных.

Дабы вы поняли всю прелесть и пикантность ситуации, добавлю — база мало того, что неиндексированная, так ещё и с отсутствующим ключевым полем.

Хранится всё это Щастье в dbf. Разного рода вспомогательные базы, базочки, базюшечки и просто обновления — в том же dbf.

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

Заканчивая лирическое отступление, расскажу — как я загоняю dbf-ки в MySQL и потом выковыриваю их обратно.

aptitude search навёл меня на утилиту dbf2mysql

Я не буду пересказывать здесь ман, вскользь отмечу только, что ключ "перевести имена полей в нижний регистр" работает, а вот "перевести значения полей в нижний/верхний регистр" — не работает.

У утилиты этой есть один, но существенный на мой взгляд недостаток. Автор её и слыхом не слыхивал о существовании кодировок, отличных от latin1. В результате имеем таблицу в кодировке latin1, набитую данными в кодировке CP866.

Но нас таким не напугаешь. Возможно кто-то применит секретное заклинание alter table, сменит тип данных с текстового на blob, выправит кодировку, а потом сменит тип данных обратно, но это не мой путь. Этих самых полей у меня — неисчислимое множество (ну вру. Исчислимое, что уж там. Но всё равно — много).

Выручает старый-добрый mysqldump с принудительным выставлением кодировки в latin1.

Обрабатываем полученный файл напильником iconv'ом, перегоняя из CP866 в юникод, меняем в нём кодировку с latin1 на utf8, drop-аем таблицу, загоняем дамп обратно в мускуль — et voila!

Дабы работать было удобнее, добавляю отдельное поле типа int, заполняю его автоинкрементом и индексирую по нему. Иначе — совсем грустно. Но это уже сугубо моя локальная специфика.

Самое интересное начинается, когда приходит время загнать данные из MySQL обратно в dbf. Вот тут уже — чистое шаманство. Вышеупомянутая утилита dbf2mysql имеет и оборотную сторону mysql2dbf. И даже вроде как работает, но... Но о кодировках, отличных от latin1 можно забыть.

Но настоящего джедая не напугать такими мелочами. Берём, делаем выборку из MySQL, посредством INTO OUTFILE формируем csv, открываем готовую dbf-ку с нужной структурой редактором dbf от pssoft.ru (спасибо автору), удаляем все данные и импортируем туда данные из csv. Одно уточнение — данные в csv должны быть в CP1251, но это такие мелочи...

От счастливого финала нас отделяет только N-ное количество щелчков мышью. Каждое поле dbf-а нужно сопоставить полю csv-шки. Автоматизировать — никак. У меня таких полей — 70.

Клик-клик-клик...
Клик-клик-клик...
Клик-клик-клик...

ДААА! Экспорт в dbf и вожделенный файлик на диске, будь он неладен.

К чему всё это? К тому, что если кто знает способ лучше — я просто изнемогаю от желания его узнать. А пока тихо радуюсь, что результаты обработки в 90% случаев нужны не в dbf, а в xls, получить который из csv — дело пары минут.

Занавес.




Комментарии

Страницы комментариев: 1 :: 2 :: следующая

аноним, Tue Sep 29 13:30:45 2009:
аноним_, понедельник, 7 сентября 2009 г. 21:03:30:
Тогда уж Lazarus он бесплатный, Дельфи стоит много денег.
l1ker, Mon Sep 28 08:58:39 2009:
Вобще как вариант MyDBF2MySQL, только из скуэля в дбф не получится))
аноним_, Mon Sep 7 21:05:55 2009:
А, черт, вы же с другой планеты - планеты пингвинов...
аноним_, Mon Sep 7 21:03:30 2009:
Читаль и плакаль...
Ребят, вы наверное не в курсе - есть Delphi там всякие, а кроме "мускуля" есть Firebird (с действительно свободной лицензией, кстати).
Нет, мы легких путей не ищем - подавай нам 100 утилиток!!!
аноним, Mon Sep 7 10:39:26 2009:
А почему бы не использовать Python? Там хватит скриптика строк на 10
аноним, Sun Sep 6 16:54:17 2009:
юникод - R.I.P.
Skiffartur, Sun Sep 6 14:49:49 2009:
#bash
#из dbf в mysql
dbf2mysql -vvv -d databasename -t tablename -c -h localhostorother -P mysqlpassword -U myysqllogin file.dbf
mysqldump -umysqllogin -pmysqlpasswordorblank --default-character-set=latin1 databasename tablename>out.sql
iconv -f cp866 -t utf-8 out.sql>outtmp.sql
more outtmp.sql|sed 's/latin1/utf8/'>out.sql
mysql -umysqllogin -pmysqlpasswordorblank -T --show-warning -e "delete from tablename" databasename
mysql -umysqllogin -pmysqlpasswordorblank -T --show-warning databasename<out.sql
rm out.sql&rm outtmp.sql

#Теперь обратно
mysqldump -umysqllogin -pmysqlpasswordorblank databasename tablename>out.sql
more out.sql|sed 's/utf8/latin1/'>outtmp.sql
iconv -t cp866 -f utf-8 outtmp.sql>out.sql
mysql -umysqllogin -pmysqlpasswordorblank -T --show-warning -e "delete from tablename" databasename
mysql -umysqllogin -pmysqlpasswordorblank -T --show-warning databasename<out.sql
mysql2dbf -vvv -d databasename -t tablename -h localhostorother -P mysqlpassword -U mysqllogin outfile.dbf
rm sotr.sql&rm sotrtmp.sql
аноним, Wed Dec 24 19:38:51 2008:
Забавно. В Windows это делается в 2 клика мышкой -> Просто импортируются данные в MS SQL.
аноним2, Wed Dec 24 15:27:01 2008:
Apache+PHP+MySQL
Вполне нормально работает.
Причем если известны заранее поля из которых нужно брать данные - добавляем таблицу соответствия полей и все. Проблема с кодировкой решается просто - mysql_query("SET NAMES cp1251");
Кстати таблицу приведения полей dBase к MySQL содрал у http://server.bo-bo.si/php/dbfConverter/ (ссылку не проверял, но программа в Интернете валяется)
аноним1,732, Wed Dec 24 12:45:37 2008:
а если посмотреть в сторону Base из пакета openoffice? он кажется может работать и с тем и с другим, по крайней мере коннектится по ODBC, и правила там можно пролписать какие угодно и кодировку переправить, и с импортом-экспортом в эксель тоже проблем нет?

Страницы комментариев: 1 :: 2 :: следующая

Комментарии заморожены.

Новости:

Все новости на CitCity.ru

Компании месяца

 
Последние комментарии
Почему школам следует использовать только свободные программы (101)
20 Декабрь, 14:51
ОСТОРОЖНО: ВИНДОФИЛИЯ! (2250)

24 Декабрь, 22:53
Linux в школе: мифы про школу и информатику (334)
24 Декабрь, 22:43
Kubuntu Feisty (15)
24 Декабрь, 18:42
Software is like sex: it's better when it's free.
©Linus Torvalds