Скрипт импорта.
procedure Form1_Button2_OnClick (Sender: string; var Cancel: boolean);
var
OpenDialog: TOpenDialog; // объект для диалога выбора файла
sl: TStringList; // объект, представляющий из себя текстовый список
arrStr: array of string; // массив, в который будет возвращаться результат функции SplitString
i,c: integer; // числовые переменные для цикла
ValuteID: string;
sDate: string;
sval: string;
begin
OpenDialog := TOpenDialog.Create(Form1); // создаем диалог выбора файла
if OpenDialog.Execute then // запускаем диалог выбора файла, если результат выполенения True, значит файл был выбран
begin
sl := TStringList.Create; // создаем объект - текстовый список
sl.LoadFromFile (OpenDialog.FileName); // загружаем в него csv файл, который пользователь выбрал через диалог выбора файла
c := sl.Count - 1; // в переменной c будет содержаться количество строк в csv файле
for i := 0 to c do // запускаем цикл, чтобы пройтись по всем строчкам csv файла, который загрузили в объект sl (TStringList)
begin
arrStr := SplitString(sl[i], ';'); // sl[i] возвращает строку из csv файла, которую функция SplitString разделяет на столбцы. В данном csv файле в качестве разделителя столбцов используется знак ;
// date - текстовое содержимое первого столбца содержится в arrStr[0]
if arrStr[0]<>'' then // если данные есть
sDate := '"'+ FormatDateTime('yyyy-MM-DD 00:00:00.000', StrToDate(arrStr[0])) + '"' // приводим дату к формату, который необходим для записи в БД
else sDate := 'NULL'; // иначе значение NULL
// id_valute - текстовое содердимое второго столбца содержится в arrStr[1]
ValuteID := SQLExecute ('SELECT id FROM valute WHERE valute LIKE "' + arrStr[1] +'"'); // ищем идентификатор названия валюты
if ValuteID = '' then ValuteID := 'NULL';
// value - текстовое содержимое третьего столбца содердижится в arrStr[2]
arrStr[2] := ReplaceStr(arrStr[2], ',', '.'); // т.к. в arrStr[2] число с плавающей запятой, на всякий случай заменяем запятую на точку, т.к. для записи в БД числа с плавающей запятой используется точка
if arrStr[2] = '' then arrStr[2] := 'NULL';
// проверяем, для избежания дубликатов, данная проверка не обязательна, и зависит от вашей ситуации
sval := SQLExecute('SELECT id FROM currency WHERE (date = ' + sDate + ') AND (id_valute = ' + ValuteID + ') AND (value = ' + arrStr[2] + ') ;');
if sval = '' then // если в переменной sval - пусто, значит SQL запрос ничего не вернул, и дубликата данных нет
SQLExecute ('INSERT INTO currency (date, id_valute, value) VALUES ('+ sDate +','+ ValuteID +','+arrStr[2] +');'); // с помощью SQL запрос вставляем данные в БД
Form1.Label1.Caption := IntToStr(i) + ' of ' + IntToStr(c); // выводим в компонент надписи, какое количество строк с данными обработано
Application.ProcessMessages; // необходимо, чтобы надпись в Label один обновилась
end;
sl.Free; // уничтожаем объект, после работы с ним
Form1.TableGrid1.dbUpdate; // заставляем TableGrid обновить данные
end;
OpenDialog.Free; // уничтожаем объект, после работы с ним
end;
begin
end.