Давно Вас Дмитрий не терроризировал, а тут Кунар80 опередил, может Вы поможете, а может кто другой - суть в следующем имею рабочий скрипт по восстановлению базы из csv, но была проблема с переносом информации из поля memo, так как хранилась в многострочном виде, и сохраняло только кусок текста до переноса строки. Увидел эту тему, пытался применить пост выше на 1 от этого, так как я понял проблема была однотипная но никак ее решить у меня не получается, может окажете легкую помощь? (восстанавливать пытался в тесте данные экспортированные в ексель, а затем сохраненные в csv)
текст листинга с комментариями рабочего кода но с описанной выше проблемой:
информация для восстановления из поля memo хранится в строке if arrStr[4]<>'' then sPrimechanie := '"' + arrStr[4] + '"' else sPrimechanie := 'NULL';
procedure OTKAZNIE_MATERIALI_ImportVidMat_OnClick (Sender: string; var Cancel: boolean); ///ИМПОРТ ДАННЫХ ИЗ CSV ФАЙЛА ДЛЯ РЕАЛИЗАЦИИ ПЕРЕНОСА И БЭКАПА
var
OpenDialog: TOpenDialog; // объект для диалога выбора файла
sl: TStringList; // объект, представляющий из себя текстовый список
arrStr: array of string; // массив, в который будет возвращаться результат функции SplitString
sID: string; // ПЕРЕМЕННАЯ ID
i,c: integer; // числовые переменные для цикла
sVidMat: string; // переменная - вид материала
sMaterial: string; // переменная - номер материала
sGod: string; // переменная - год материала
sDataVidachi: string; // переменная - дата выдачи материала
sFio: string; // переменная - фио получателя
sSluzbi: string; // переменная - служба получателя
sPrimechanie: string; // переменная - примечение
sNavsegda: string; // переменная - если выдан навсегда, либо приобщен к чему либо
srecord_count: string;
sval: string;
sYesNo: string;
begin
OpenDialog := TOpenDialog.Create(OTKAZNIE_MATERIALI); // создаем диалог выбора файла
//OpenDialog.InitialDir := 'd:\Archive 1.01\ImportCSV'; либо можно изменить на фыбор по умолчанию
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 файле в качестве разделителя столбцов используется знак ;
//if arrStr[0]<>'' then srecord_count:= '"' + arrStr[0] + '"' else srecord_count:= 'NULL';
//if arrStr[0]<>'' then sID := '"' + arrStr[0] + '"' else sID := 'NULL';
if arrStr[0]<>'' then sMaterial := '"' + arrStr[0] + '"' else sMaterial := 'NULL';
if arrStr[1]<>'' then sGod := '"' + arrStr[1] + '"' else sGod := 'NULL';
if arrStr[2]<>'' then // если данные есть
sDataVidachi := '"'+ FormatDateTime('yyyy-MM-DD 00:00:00.000', StrToDate(arrStr[2])) + '"' // приводим дату к формату, который необходим для записи в БД
else sDataVidachi := 'NULL'; // иначе значение NULL
if arrStr[3]<>'' then sFio := '"' + arrStr[3] + '"' else sFio := 'NULL';
if arrStr[4]<>'' then sPrimechanie := '"' + arrStr[4] + '"' else sPrimechanie := 'NULL';
sSluzbi := SQLExecute ('SELECT id FROM sluzba WHERE sluzbi LIKE "' + arrStr[5] +'"'); // и
if sSluzbi = '' then sSluzbi := 'NULL';
sVidMat := SQLExecute ('SELECT id FROM vidmateriala WHERE vidmat LIKE "' + arrStr[6] +'"'); // и
if sVidMat = '' then sVidMat := 'NULL';
if arrStr[7]<> '' then
begin
if arrStr[7] = 'Да' then sYesNo :='1';
if arrStr[7] = 'Нет' then sYesNo :='0';
end else sYesNo:='NULL';
if arrStr[8]<>'' then srecord_count := '"' + arrStr[8] + '"' else srecord_count := 'NULL';
SQLExecute ('INSERT INTO OTKAZNIE ( [MATERIAL], [GOD], [DATA_VIDACHI], [FIO],[PRIMECHANIE],id_SLUZBA, id_VIDMATERIALA, [NAVSEGDA], [record_count]) VALUES ('+
sMaterial +','+ sGod +','+ sDataVidachi +','+ sFio +','+ sPrimechanie +','+ sSluzbi +','+ sVidMat +','+ sYesNo +','+ srecord_count + ');');
//проверяем, для избежания дубликатов, данная проверка не обязательна, и зависит от вашей ситуации
// sval := SQLExecute('SELECT id FROM otkaznie WHERE (Material = ' + arrStr[0] + ') AND (GOD = ' + arrStr[1] + ');');
// if sval = '' then // если в переменной sval - пусто, значит SQL запрос ничего не вернул, и дубликата данных нет
// SQLExecute ('INSERT INTO otkaznie (Material, GOD ) VALUES ('+ arrStr[0] + '), ('+ arrStr[1] + ');'); // с помощью SQL запрос вставляем данные в БД
OTKAZNIE_MATERIALI.ImportCSV.Caption := IntToStr(i) + ' of ' + IntToStr(c); // выводим в компонент надписи, какое количество строк с данными обработано
Application.ProcessMessages; // необходимо, чтобы надпись в Label один обновилась
end;
sl.Free; // уничтожаем объект, после работы с ним
OTKAZNIE_MATERIALI.REZULTAT.dbUpdate; // заставляем TableGrid обновить данные
end;
OpenDialog.Free; // уничтожаем объект, после работы с ним
end;
//procedure OTKAZNIE_MATERIALI_REZULTAT_OnColumnResize (Sender: string; ACol: Integer);
//begin
// OTKAZNIE_MATERIALI_REZULTAT_OnChange ('');
//end;