C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Импорт из *.txt в Interbase, Импорт из *.txt в Interbase
Kahome
Отправлено: 19.03.2004, 08:41


Не зарегистрирован







Подскажите, как перекачать таблицу из текстового файла в Interbase? Число строк больше 3 млн. Должен быть виден процесс импорта в %.
trigger
Отправлено: 19.03.2004, 11:52


Не зарегистрирован







поскольку вопрос задан на форуме билдера, то предпологается получить ответ об особенностях написания программы? тогда прога, после изучения структуры файла, будет выглядеть таким образом:
чтение данных из файа; запись в таблицу бд.
но поскольку вопрос очень уж неконкретный, то мне пришла такая мысль:
открыть файл в екселе, при открытии разбить файл на поля. сохранить его в фармате dbf. и потом утилитой datapump залить в табличку бд.
в первом случае прогресс перекачки можно отображать по такому алгоритму:
min = 0
max = "Число строк больше 3 млн"
position = +1 после кажой операции считывания, записи...
в последенем случае прогресс перекачки можно комментировать голосом ...
спасибо за вопрос!
** kahome
Отправлено: 22.03.2004, 01:35


Не зарегистрирован







Спасибо за помощь, но...
в Excel я могу работать только с 65000 записями.
В текстовом файле поля разделены знаками табуляции. Его, текстовый файл, я легко читаю с помощью BDE. Проблема вот в чем: если я буду выбирать данные построчно, из каждой строки буду инфо присваивать переменным, далее эти переменные передавать хранимой процедуре, которая и будет делать insert, то это займет массу времени, а надо уложиться хотя-бы в минут 10-20...
Слезно прошу разжевать импорт данных из огромых файлов в таблицу Inrerbase с помощью стандартных средств Buildera...
trigger
Отправлено: 22.03.2004, 10:42


Не зарегистрирован







не представляю как вы прочитали текстовый файл через бде (я просто так не делел ни разу), но раз так, то можно просто воспользоваться утилитой datapump. она входит в состав билдера. она как раз работат с данными, асоциированными с алиасами бде.
если всеже нужна прога. тогда да, вы правы. по одной записи — будет долго.
я бы навернео делал бы чтение 500-1000 строк, потом прямо из проги (без использования процедур) insert'ил бы их в таблицу. и коммит делал бы просле каждой такой пачки данных.
Guest
Отправлено: 23.03.2004, 02:50


Не зарегистрирован







Ваши ответы, как бальзам на мои раны!
Однако долго, очень долго процесс импорта идет.
Я уже пробовал так:
char ch[100];
TStringList *sl1; sl1 = new TStringList;
TStringList *sl2; sl2 = new TStringList;
...
int i = 0;
ifstream str(OpenDialog1->FileName.c_str);
while (!str.eof()) {
++i;
str.getline(ch, sizeof(ch));
// анализ ch, присваивание значений переменным и т.д.
sl1->Add(field1);
sl1->Add(field2);
if (i == 1000) {
// а как для IBQuery в этом случае нарисовать Insert ?
}
// очистка списков, i = 0
}
В общем, чепуха какая-то получается.
Самое обидное в том, что в MS SQL есть мастер, который процедуру импорта из моего *.txt желает за 5 минут!
Как он, этот мастер, реализован?!!!
Может, что-то есть в технологиях ADO?
Готов отдать последнюю рубашку, лишь бы решить эту задачу!
Кстати, на всякий случай, мой e=mail: ka1999@mail.primorye.ru
olegenty
Отправлено: 23.03.2004, 07:37


Ветеран

Группа: Модератор
Сообщений: 2412



мой вариант ответа: воспользоваться IBExpert и плагином IBDataPump, или IBDataPump в автономном варианте. нет ничего проще: настроиться, сохранить сценарий загрузки, и пользоваться потом, сколько влезет...

Вернуться в Работа с базами данных в C++Builder