Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программное обеспечение > Пакетная обработка dbf разных форматов


Автор: Akella 17.9.2009, 13:24
Из-за этой темы:
http://forum.vingrad.ru/index.php?showtopic=272794&view=findpost&p=1965971

Требуется программа для работы с разными форматами dbf: dbf IIIdbf IVdbf VI, foxpro.
Нужно перекинуть разноформатные dbf в какой-то единый формат или лучше вообще в базу MS SQL.

Автор: jhonyxakep 17.9.2009, 13:45
Akella
Цитата(Akella @  17.9.2009,  13:24 Найти цитируемый пост)
foxpro.

эээ... Оно не подходит?

или Visual Fox Pro вышел из моды?
Насчет MySQL незнаю, но в единый формат перекидывать точно можно, а насчет пакетной обработки, так на это можно написать маленький скриптик...

Автор: Akina 17.9.2009, 13:54
Сначала открываешь тупо как бин-файл и опредляешь по заголовку, фокс или д-бэйз. Исхоля из результата выбираешь соотв. драйвер подключения - foxpro или dbase-5.

Автор: jhonyxakep 17.9.2009, 14:03
Цитата(Akina @  17.9.2009,  13:54 Найти цитируемый пост)
Сначала открываешь тупо как бин-файл и опредляешь по заголовку, фокс или д-бэйз. Исхоля из результата выбираешь соотв. драйвер подключения - foxpro или dbase-5.

Зачем-же так сложно? НЕ проще работать с уже готовыми инструментами?

Автор: Akina 17.9.2009, 14:09
Цитата(jhonyxakep @  17.9.2009,  15:03 Найти цитируемый пост)
НЕ проще работать с уже готовыми инструментами? 

И какой готовый инструмент умеет "на лету" определять, DBase или FoxPro DBF ему подсунули? И, главное, перестраиваться на работу с соотв. форматом?
ЕМНИП штатные ODBC такого не умеют, а один другого не разумеет.

Автор: Akella 17.9.2009, 14:20
Цитата(jhonyxakep @  17.9.2009,  13:45 Найти цитируемый пост)
Akella, 
Цитата(Akella @  17.9.2009,  13:24 Найти цитируемый пост)
foxpro.

эээ... Оно не подходит?


Кто, куда не подходит?

Автор: Данкинг 17.9.2009, 14:42
Цитата(Akella @  17.9.2009,  14:24 Найти цитируемый пост)
Нужно перекинуть разноформатные dbf 

Вот этого я и не пойму никак: что значит "разноформатные"? smile 

Ну, к примеру, открою я XLS-лист, в нём 50 полей. Я делаю ширину всех полей равной 250. Сохраняю как DBF. Пытаюсь открыть через FoxPro - таблица не откроется с ошибкой "not a table".  И? smile Какая тут универсальность может быть?

Автор: jhonyxakep 18.9.2009, 06:40
Цитата(Данкинг @  17.9.2009,  14:42 Найти цитируемый пост)
Вот этого я и не пойму никак: что значит "разноформатные"?  

Существует множество форматов dbf

Цитата(Akella @  17.9.2009,  14:20 Найти цитируемый пост)
Кто, куда не подходит?

Да вон тот же Visual fox pro 9
Цитата(Akina @  17.9.2009,  14:09 Найти цитируемый пост)
И какой готовый инструмент умеет "на лету" определять, DBase или FoxPro DBF ему подсунули? И, главное, перестраиваться на работу с соотв. форматом?ЕМНИП штатные ODBC такого не умеют, а один другого не разумеет.

ВЫ fox ом хоть раз пользовались?

Автор: Akina 18.9.2009, 07:31
Цитата(jhonyxakep @  18.9.2009,  07:40 Найти цитируемый пост)
ВЫ fox ом хоть раз пользовались? 

Фоксом - нет.
Я из VB6 через Фокспрошный ODBC-драйвер цеплял в программу Фоксовые же базы. Несколько раз приходилось брать данные из DBF то же структуры, созданного Клипперовской программой. Так вот - если я правильно помню номера версий, те DBF, что были созданы в Клипере 5.01, открывались как родные, а на те, что созданы в 5.2, драйвер ругался, что не может распознать формата.

Автор: Akella 18.9.2009, 13:20
Цитата(Данкинг @  17.9.2009,  14:42 Найти цитируемый пост)
Вот этого я и не пойму никак: что значит "разноформатные"?

Ты читал-то хоть моё первое сообщение?

Цитата(Akella @  17.9.2009,  13:24 Найти цитируемый пост)
 dbf III, dbf IV, dbf VI, foxpro.


Добавлено @ 13:21
Цитата(Данкинг @  17.9.2009,  14:42 Найти цитируемый пост)
Ну, к примеру, открою я XLS-лист, в нём 50 полей. Я делаю ширину всех полей равной 250. Сохраняю как DBF. Пытаюсь открыть через FoxPro - таблица не откроется с ошибкой "not a table".  И? smile Какая тут универсальность может быть?

Я понял, что ты или потроллить сюда пришёл или ничего не понял, что нужно человеку. А по сему прошу не писАть сюда больше глупых вопросов. Если не понял, то читай внимательно все ТРИ ТЕМЫ. Ссылки есть. В противном случае прошу не мешать.

Автор: Akina 18.9.2009, 13:27
Цитата(Akella @  18.9.2009,  14:20 Найти цитируемый пост)
dbf VI

Кстати, а это что за зверик? Dbase Level 7? что ли?

Добавлено через 1 минуту и 5 секунд
Кстати, Level 7 ни один ODBC-драйвер вообще не кушает, походу... см. http://forum.vingrad.ru/forum/topic-273250/unread-1.html

Автор: Данкинг 18.9.2009, 14:38
Цитата(Akella @  18.9.2009,  14:20 Найти цитируемый пост)
Я понял, что ты или потроллить сюда пришёл или ничего не понял, что нужно человеку. 

Я понял, что ты или не знаешь значения понятия "троллинг", или ничего не понял из того, что я написал. Посему мешать не буду. smile

Добавлено @ 14:41
Да, по этому поводу:
Цитата(Akella @  18.9.2009,  14:20 Найти цитируемый пост)
Ты читал-то хоть моё первое сообщение?

Есть такая программа, называется "Microsoft Excel". smile

Добавлено @ 14:43
Цитата(jhonyxakep @  18.9.2009,  07:40 Найти цитируемый пост)
Да вон тот же Visual fox pro 9

Скиньте мне табличку, которую не открывает VFP. smile 

Автор: Akina 18.9.2009, 14:53
Цитата(Данкинг @  18.9.2009,  15:38 Найти цитируемый пост)
Скиньте мне табличку, которую не открывает VFP.

В теме, что я дал чуть выше, в аттаче с проектом есть такой файл.

Автор: Данкинг 18.9.2009, 15:29
Цитата(Akina @  18.9.2009,  15:53 Найти цитируемый пост)
В теме, что я дал чуть выше, в аттаче с проектом есть такой файл. 

А, ну да. Так его ни Excel, ни FoxPro не открывают.  Это этот формат dbf VI и есть? smile 

Автор: former 18.9.2009, 19:34
Цитата(Akella @  17.9.2009,  13:24 Найти цитируемый пост)
Требуется программа для работы с разными форматами dbf: dbf III, dbf IV, dbf VI, foxpro.

DBF Viewer 2000.

Автор: Akella 18.9.2009, 23:13
Цитата(Akina @  18.9.2009,  13:27 Найти цитируемый пост)
Цитата(Akella @  18.9.2009,  14:20 Найти цитируемый пост)
dbf VI

Кстати, а это что за зверик? Dbase Level 7? что ли?

Не знаю, это просто я пример привёл того, что dbf бывают разных форматов

Добавлено через 1 минуту и 33 секунды
Цитата(Данкинг @  18.9.2009,  14:38 Найти цитируемый пост)
Есть такая программа, называется "Microsoft Excel".

Тогда помоги человеку и научи, как конвернуть 50 тысяч разноформатных dbf в единый формат. мне тоже интересно.

Добавлено через 5 минут и 18 секунд
Цитата(former @  18.9.2009,  19:34 Найти цитируемый пост)
DBF Viewer 2000. 

Цитата

# Export dbf files to CSV, TXT, XML, Excel, HTML, PRG, SQL file formats
# Export dbf to SQL script: MS SQL, MySQL, Oracle, PostgreSQL
# View, edit and export memo files (.fpt, .dbt, .smt)
# Export from command line with filter


Думаю, что можно чего-нить замутить с этой утилиткой.

Автор: jhonyxakep 21.9.2009, 12:55
Цитата(Akella @  18.9.2009,  23:13 Найти цитируемый пост)
Думаю, что можно чего-нить замутить с этой утилиткой.

Так, а гугл не у всех работает что-ли?

Автор: 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 @  23.9.2009,  18:30 Найти цитируемый пост)
А таблицы структуры одной, или как?

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

Автор: Infector 24.9.2009, 11:16
Из начала темы понял, что форматы разные... А про структуру (типы и размер полей, или хотя бы имена) ни слова.
Дело в том, что у меня от разной структуры проблем было больше, чем от разного формата, т.к. на основе BDE все имевшиеся форматы открылись.
А так как структура была однаковой, то запустил через C++ Builder обработку в цикле всего содержимого папки. (правда всю структуру пришлось описать) Выходные файлы (в моем случае были тоже dbf) уже стандартизированные. 

Если размер полей разный, то сделать сложнее, но тоже можно. Хотя бы имена и тип полей совпадают?

Вот таким образом, сливал все dbf в папке в одну, в FILDS.INI предется перечислить все поля поименно через запятую, можно развить тему и дальше, если нужно...

Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button1Click(TObject *Sender)
{
//открытие файла со списком полей
  
  AnsiString ProgDir=ExtractFileDir(Application->ExeName);
//перебор всех файлов входной поддиректории и вставка в выходной файл
  for (int i=0; i<FileListBox1->Count; i++)
    {
     Query1->SQL->Clear();
     Query1->SQL->Add("insert into \""+ProgDir+"\\itog.dbf\" (");
     //вставка списка имен полей
     for (int k=0; k<ListBox1->Count; k++)
      {
       Query1->SQL->Add(ListBox1->Items->Strings[k]);
      }
     Query1->SQL->Add(") select");
     //опять вставка полей
     for (int l=0; l<ListBox1->Count; l++)
      {
       Query1->SQL->Add(ListBox1->Items->Strings[l]);
      }
     Query1->SQL->Add("from \""+ProgDir+"\\IN\\"+FileListBox1->Items->Strings[i]+"\"");
     //перенос условий отбора из мемо
     for (int n=0; n<Memo1->Lines->Count; n++)
      {
       Query1->SQL->Add(Memo1->Lines->Strings[n]);
      }
     Memo2->Lines->Assign(Query1->SQL);
     Query1->ExecSQL();
    }

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   ListBox1->Items->LoadFromFile("Fields.ini");
}
//---------------------------------------------------------------------------


Автор: Данкинг 24.9.2009, 11:46
Цитата(Infector @  24.9.2009,  12:16 Найти цитируемый пост)
Дело в том, что у меня от разной структуры проблем было больше, чем от разного формата, 

С чего бы? С разной структурой бороться элементарно: заводишь переменную (ну или TStringList) для хранения названий полей. Перебираешь все таблицы, которые нужно слить, а в них с свою очередь перебираешь поля. Если данного поля в TStringList ещё нет, то добавляешь его. Далее создаёшь новую таблицу из всех полей, которые содержатся в TStringList - главное, чтобы суммарное число полей не превышало разрешённого для данной СУБД. Ну а далее - ещё проще: заново проходим по таблицам и переносим соответствующие значения полей в нашу новую таблицу. Тут я ещё не учёл, разумеется, типа полей, т.е. если в двух таблицах есть поля с одинаковыми названиями, но разными типами, то или преобразовывать к одному какому-то (текстовому, логичней всего).

Цитата(Akella @  19.9.2009,  00:13 Найти цитируемый пост)
Тогда помоги человеку и научи, как конвернуть 50 тысяч разноформатных dbf в единый формат. мне тоже интересно.

Большинство DBF открывает FoxPro, что не откроется фоксом - то можно попробовать как раз через Excel. Если тоже не получится - то моё такое мнение, что данная задача решения не имеет. Пусть меня кто-нибудь поправит. smile 

Автор: 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/
Есть Отдельная глава по поводу запросов

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)