Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Программное обеспечение > Пакетная обработка dbf разных форматов |
Автор: Akella 17.9.2009, 13:24 |
Из-за этой темы: http://forum.vingrad.ru/index.php?showtopic=272794&view=findpost&p=1965971 Требуется программа для работы с разными форматами dbf: dbf III, dbf IV, dbf VI, foxpro. Нужно перекинуть разноформатные dbf в какой-то единый формат или лучше вообще в базу MS SQL. |
Автор: jhonyxakep 17.9.2009, 13:45 |
Akella, эээ... Оно не подходит? или Visual Fox Pro вышел из моды? Насчет MySQL незнаю, но в единый формат перекидывать точно можно, а насчет пакетной обработки, так на это можно написать маленький скриптик... |
Автор: Akina 17.9.2009, 13:54 |
Сначала открываешь тупо как бин-файл и опредляешь по заголовку, фокс или д-бэйз. Исхоля из результата выбираешь соотв. драйвер подключения - foxpro или dbase-5. |
Автор: Akina 17.9.2009, 14:09 |
И какой готовый инструмент умеет "на лету" определять, DBase или FoxPro DBF ему подсунули? И, главное, перестраиваться на работу с соотв. форматом? ЕМНИП штатные ODBC такого не умеют, а один другого не разумеет. |
Автор: Akella 17.9.2009, 14:20 | ||
Кто, куда не подходит? |
Автор: Данкинг 17.9.2009, 14:42 |
Вот этого я и не пойму никак: что значит "разноформатные"? ![]() Ну, к примеру, открою я XLS-лист, в нём 50 полей. Я делаю ширину всех полей равной 250. Сохраняю как DBF. Пытаюсь открыть через FoxPro - таблица не откроется с ошибкой "not a table". И? ![]() |
Автор: jhonyxakep 18.9.2009, 06:40 | ||
Существует множество форматов dbf Да вон тот же Visual fox pro 9
ВЫ fox ом хоть раз пользовались? |
Автор: Akina 18.9.2009, 07:31 |
Фоксом - нет. Я из VB6 через Фокспрошный ODBC-драйвер цеплял в программу Фоксовые же базы. Несколько раз приходилось брать данные из DBF то же структуры, созданного Клипперовской программой. Так вот - если я правильно помню номера версий, те DBF, что были созданы в Клипере 5.01, открывались как родные, а на те, что созданы в 5.2, драйвер ругался, что не может распознать формата. |
Автор: Akella 18.9.2009, 13:20 | ||
Ты читал-то хоть моё первое сообщение? Добавлено @ 13:21
Я понял, что ты или потроллить сюда пришёл или ничего не понял, что нужно человеку. А по сему прошу не писАть сюда больше глупых вопросов. Если не понял, то читай внимательно все ТРИ ТЕМЫ. Ссылки есть. В противном случае прошу не мешать. |
Автор: Akina 18.9.2009, 13:27 |
Кстати, а это что за зверик? Dbase Level 7? что ли? Добавлено через 1 минуту и 5 секунд Кстати, Level 7 ни один ODBC-драйвер вообще не кушает, походу... см. http://forum.vingrad.ru/forum/topic-273250/unread-1.html |
Автор: Данкинг 18.9.2009, 14:38 | ||
Я понял, что ты или не знаешь значения понятия "троллинг", или ничего не понял из того, что я написал. Посему мешать не буду. ![]() Добавлено @ 14:41 Да, по этому поводу: Есть такая программа, называется "Microsoft Excel". ![]() Добавлено @ 14:43 Скиньте мне табличку, которую не открывает VFP. ![]() |
Автор: Akina 18.9.2009, 14:53 |
В теме, что я дал чуть выше, в аттаче с проектом есть такой файл. |
Автор: Данкинг 18.9.2009, 15:29 |
А, ну да. Так его ни Excel, ни FoxPro не открывают. Это этот формат dbf VI и есть? ![]() |
Автор: former 18.9.2009, 19:34 | ||
DBF Viewer 2000. |
Автор: Akella 18.9.2009, 23:13 | ||||
Не знаю, это просто я пример привёл того, что dbf бывают разных форматов Добавлено через 1 минуту и 33 секунды Тогда помоги человеку и научи, как конвернуть 50 тысяч разноформатных dbf в единый формат. мне тоже интересно. Добавлено через 5 минут и 18 секунд
Думаю, что можно чего-нить замутить с этой утилиткой. |
Автор: jhonyxakep 21.9.2009, 12:55 |
Так, а гугл не у всех работает что-ли? |
Автор: Infector 22.9.2009, 19:22 |
Меня DataBase Desktop вполне устраивает, проглатывает большую часть творчества клиентов(включая level 7 dbf). Входит в комплект поставки C++Builder. Чтобы работал нужно еще установить BDE-Administrator. Минусы - если расширение не dbf и не db ничего не открывает независимо от содержимого. Плюсы - можно выполнять простейшие SQL запросы вроде, помогает при выборе из разных таблиц |
Автор: Akella 23.9.2009, 11:37 |
Infector, прочитай первые два слова в названии темы. |
Автор: Infector 23.9.2009, 18:30 |
А таблицы структуры одной, или как? В свое время таблицы одной структуры сливал самопальной прогой. |
Автор: Akella 23.9.2009, 23:00 |
опять же... тогда уже прочти внимательно полностью название темы и в первом сообщении есть ссылка на другую тему, откуда всё и пошло |
Автор: Infector 24.9.2009, 11:16 | ||
Из начала темы понял, что форматы разные... А про структуру (типы и размер полей, или хотя бы имена) ни слова. Дело в том, что у меня от разной структуры проблем было больше, чем от разного формата, т.к. на основе BDE все имевшиеся форматы открылись. А так как структура была однаковой, то запустил через C++ Builder обработку в цикле всего содержимого папки. (правда всю структуру пришлось описать) Выходные файлы (в моем случае были тоже dbf) уже стандартизированные. Если размер полей разный, то сделать сложнее, но тоже можно. Хотя бы имена и тип полей совпадают? Вот таким образом, сливал все dbf в папке в одну, в FILDS.INI предется перечислить все поля поименно через запятую, можно развить тему и дальше, если нужно...
|
Автор: Данкинг 24.9.2009, 11:46 | ||||
С чего бы? С разной структурой бороться элементарно: заводишь переменную (ну или TStringList) для хранения названий полей. Перебираешь все таблицы, которые нужно слить, а в них с свою очередь перебираешь поля. Если данного поля в TStringList ещё нет, то добавляешь его. Далее создаёшь новую таблицу из всех полей, которые содержатся в TStringList - главное, чтобы суммарное число полей не превышало разрешённого для данной СУБД. Ну а далее - ещё проще: заново проходим по таблицам и переносим соответствующие значения полей в нашу новую таблицу. Тут я ещё не учёл, разумеется, типа полей, т.е. если в двух таблицах есть поля с одинаковыми названиями, но разными типами, то или преобразовывать к одному какому-то (текстовому, логичней всего).
Большинство DBF открывает FoxPro, что не откроется фоксом - то можно попробовать как раз через Excel. Если тоже не получится - то моё такое мнение, что данная задача решения не имеет. Пусть меня кто-нибудь поправит. ![]() |
Автор: Infector 24.9.2009, 12:24 |
Я через средства от Borland работаю. Основной принцип: средствами C++Builder собирается SQL запрос и запускается на выполнение. (или их серия последовательно собирается и запускается) Чтобы привести к единому формату кучу dbf требуется папка с исходными таблицами и папка для выходных таблиц. Запускаем цикл и для каждой исходной таблицы собираем и выполняем 1. Запрос "create table" в папке выходных таблиц. Он уже создает таблицы одного формата (dbf или Paradox (db), с MS SQL не эксперементировал) и вставлять данные туда можно из разноформатных dbf. Можно так же заменить "create table" копированием заранее заготовленного шаблона 2. Если размер полей все-таки разный: а) запрос "alter table", создающий в старой таблице временные поля размерностью и типом эдентичные полям выходной таблицы б) запрос "update", перегоняющий данные из полей исходной таблицы в стандартизированные временные. 3. запрос "insert into....... select....." в общем-то этот запрос и требует соответствия типов полей и их размерности. Внутри запросов должны быть описаны имена полей и кое-где структура. В общем-то по поводу разного наименования полей можно выкрутиться, вставив в Builder конструкцию "try - catch", а обработанные файлы перемещая из исходной папки в другую. Врят ли вариантов структуры окажется настолько много, что их нельзя будет обработать в несколько заходов, перестраивая при этом настройку имен полей. Довольно толковая книга по работе с базами: http://www.yugzone.ru/x/rabota-s-bazami-dannykh-v-c-builder/ Есть Отдельная глава по поводу запросов |