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

 
Импорт из txt файла в таблицу SQL
O.Lena
Отправлено: 11.11.2004, 08:36


Ученик-кочегар

Группа: Участник
Сообщений: 21



Подскажите, пожалуйста! Каким образом можно в базу MS SQL Serverа в таблицу вставить данные их txt файла. Данные в текстовом файле позиционированы: с 1-10 код строки, 11-40 название организации, 41-56 сумма и т.п.
AVC
Отправлено: 11.11.2004, 09:19


Ветеран

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



Можно для этого что-то написать своё
или если работа одноразовая
зачитываем в Excel, сохраняем в dbf, перекачиваем DataPump'ом в базу
O.Lena
Отправлено: 11.11.2004, 10:50


Ученик-кочегар

Группа: Участник
Сообщений: 21



Да получается что надо чтобы происходило постоянное сканирование определенного каталога на наличие txt файла и загрузка данных в базу. Нашла пример, но только со считыванием строки до конца, а мне нужно, чтобы по позициям с 1 по 10-ю в таблицу в поле код платежа, с 11 по 40-ю в поле Организация и с 41-ой по 56-ю в поле сумма.
avc*
Отправлено: 11.11.2004, 10:57


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







Считывайте строку до конца и вырезайте нужные куски в поля smile.gif и отправляйте серверу
Konstantine
Отправлено: 11.11.2004, 11:11


Мастер участка

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



если файл прямоугольный (в строках ВЕЗДЕ одинак. кол-во символов), то читай через структуру:
CODE
struct
{
 char[10] sID;
 char[30] sOrg;
 char[16] sSum;
 char[2] sRet;      // для символов 0d 0a;
}

считуй с файла в структуру, а из неё поля переводи в int и кидай в базу.
timson
Отправлено: 11.11.2004, 12:56


Станционный диспетчер

Группа: Участник
Сообщений: 82



to Konstantine:
использование структур не везде приводит к правильному результату:
CODE
struct
{
char[10] sID;
char[30] sOrg;
char[16] sSum;
char[2] sRet; // для символов 0d 0a;
} row;

..
fgets( (char*) &row, sizeof(row), f);

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

выравнивает данные на границу в 4 байта. Т.е. поле row.sOrg начинается в памяти с 12 байта.

поэтому рекомендация: никогда не пишите данные блоком целеком в структуру, если нет 100% уверенности, что в памяти они

совпадают по формату...
(или что-то вроде такого)


согласен с avc*:
CODE
while(!feof(f))
{
char buf[100] = { 0 };
fgest(buf, 100, f);

char id[11] = { 0 };
char name[31] = { 0 };
char price[17] = { 0 };

sscanf(buf,"%10c%30c%16", id, name, price);

WriteToBD(id, name, price);
}

не проверял, так сходу набросал.

Отредактировано timson — 11/11/2004, 14:03
Konstantine
Отправлено: 11.11.2004, 14:38


Мастер участка

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



QUOTE
выравнивает данные на границу в 4 байта.

чтоб этого не было есть директивы прекомпилятора (правда не помню какие...) — недавно были
Boyko
Отправлено: 11.11.2004, 15:06


Станционный диспетчер

Группа: Участник
Сообщений: 88



QUOTE (timson @ 11/11/2004, 12:58)


... Т.е. поле row.sOrg начинается в памяти с 12 байта.


2 timson

Абсолютно не так!
Поле row.sOrg начинается в памяти с 10 байта!!!

QUOTE (timson @ 11/11/2004, 12:58)


... выравнивает данные на границу в 4 байта


Только в начале и в конце структур, перед int и т.д. Никогда перед char[10]!!! cool.gif
Konstantine
Отправлено: 11.11.2004, 16:04


Мастер участка

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



если чё, то о выравнивании
Тут
timson
Отправлено: 11.11.2004, 19:54


Станционный диспетчер

Группа: Участник
Сообщений: 82



QUOTE
Поле row.sOrg начинается в памяти с 10 байта!!!
был не прав, действительно с 10 байта..

QUOTE
Только в начале и в конце структур, перед int и т.д. Никогда перед char[10]!!!
специально разобрался с этим..
смотрел в дизассемблере, выравнивание идет перед полями типов не char, а далее за ним (т.к. ровно и так) идет char[10]
CODE
struct A
{
char sID[5];
int a;
char c[5];
};
в память ложится так:
CODE

cccc
c...
iiii
cccc
c...

sizeof(A) = 20 байт.
Boyko
Отправлено: 12.11.2004, 12:18


Станционный диспетчер

Группа: Участник
Сообщений: 88



QUOTE (timson @ 11/11/2004, 19:56)
в память ложится так:
CODE

cccc
c...
iiii
cccc
c...

sizeof(A) = 20 байт.

Я так и сказал, перед int и в конце структур! biggrin.gif

Вернуться в Вопросы программирования в C++Builder