Topic: Импорт файлов

Доброго времени суток! Наконец-то нашёл стоящую программу для создания баз. В программировании не разбираюсь. Подскажите, как написать скрипт для кнопки импорта в таблицу базы данных со столбцами 1,2,3,4,5, (где 1 - столбец с датой, 2 - числовой, остальные - текстовые) из файла *.csv c теми же наименованиями и характеристиками столбцов.
Заранее благодарен!

Re: Импорт файлов

Импорт можно сделать сторонней программой для работы с базой SQLite, например этой
http://sqlitestudio.pl/


также можете скачать проект с примером, как сделать импорт csv файла

Post's attachments

Attachment icon Import CSV.zip 4.77 kb, 2054 downloads since 2014-10-18 

Dmitry.

Re: Импорт файлов

В sqlite studio пробовал, в самой программе вроде получилось, но не знаю как перенести результаты в существующую базу.
В скачанном примере не могу разобраться с написанием кода, т.к. новичок в этом. Не могли бы вы к строчкам скрипта написать пояснения, если это возможно!? Буду учиться на практике!
Большое спасибо!

Re: Импорт файлов

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

Скачайте этот проект, дополнил его подробными комментариями.

Post's attachments

Attachment icon Import CSV ru.zip 5.67 kb, 1089 downloads since 2014-10-19 

Dmitry.

Re: Импорт файлов

Большое спасибо! Понятно объясняете. С моим уровнем знаний, а точнее незнанием , что посоветуете прочитать, чтобы было хоть какое-то представление о написании кода и его структуре?

Re: Импорт файлов

Добрый день! Вопрос! Сколько будет стоить написание скрипта для кнопки в моем случае? Желание научиться этому есть, времени - нет. Проект базы есть, не хватает только кнопки с данной функцией.

Re: Импорт файлов

alekeviv
В качестве скриптов используется Pascal, можете найти любую книгу для начищающих изучать Delphi.


Отправьте пожалуйста ваш проект на support@drive-software.com
cо ссылкой  на этот топик, если ничего сложно, то сделаю бесплатно.

Dmitry.

8 (edited by daperkov 2014-10-21 10:35:28)

Re: Импорт файлов

Добрый день, DriveSoft. 3-й день бьюсь над скриптом импорта данных в базу. У меня основная таблица содержит 17 столбцов 15 из которых текстовые.  Первые 5 столбцов в базу импортируются нормально, а при добавлении параметров для 6-го получаю syntax eror. По примеру, который Вы выложили мне не всё понятно, т.к. у базы в примере другая специфика и в написании скриптов я мало что понимаю (но есть желание разобраться). Не могли бы Вы мне помочь со скриптом? Спасибо Вам огромное за программу и толковую поддержку.

Re: Импорт файлов

daperkov
Приветствую )

отправьте ваш проект на support@drive-software.com
постараюсь помочь.

Dmitry.

Re: Импорт файлов

Проект отправил. Спасибо!

Re: Импорт файлов

Приветствую, DriveSoft! Проект базы отправил. Спасибо!

Re: Импорт файлов

DriveSoft! Оба примера при запуске выдают ошибку: "Undeclared identifier "SplitString" at ..." Подскажите пожалуйста, как исправить.

Не боги горшки лепят!

Re: Импорт файлов

kunar80
Эта функция (SplitString) появилась в последней версии, пожалуйста, скачайте ее
http://myvisualdatabase.com/download/myvisualdb.exe

Dmitry.

Re: Импорт файлов

Пока СПАСИБО! Но вопросы ещё обязательно будут.

Не боги горшки лепят!

15 (edited by kunar80 2014-11-19 13:23:55)

Re: Импорт файлов

Доброго всем дня! Подскажите, что это значит (см. картинку)? Label показывает, что добавлено 2 из 2, но в таблице грида они не появляются, а выскакивает эта ошибка.
И второе: значения из колонок CSV самым загадочным образом записываются в соответствующие словари проекта, если в них таких значений не было.

Post's attachments

Attachment icon 2014-11-19_123734.jpg 130.83 kb, 401 downloads since 2014-11-19 

Не боги горшки лепят!

Re: Импорт файлов

kunar80
Пришлите пожалуйста ваш проект на support@drive-software.com
посмотрю, где ошибка


И второе: это предусмотрено скриптом, добавление в словарь нового значения, если ранее его там не было.

Dmitry.

Re: Импорт файлов

DriveSoft wrote:

kunar80
Пришлите пожалуйста ваш проект на support@drive-software.com
посмотрю, где ошибка

И второе: это предусмотрено скриптом, добавление в словарь нового значения, если ранее его там не было.

Проект обязательно на днях пришлю для окончательной доводки с подробным описанием нерешённых проблем. Пока пытаюсь сам решать.
А второе можно обойти? Словари в проекте ведёт Админ, а импорт доступен всем пользователям. Стоит пользователю неправильно заполнить таблицу в CSV, и потом разгребай Админ завалы в словарях!

Не боги горшки лепят!

Re: Импорт файлов

kunar80
Можно, нужно просто закомментировать некоторые строки в вашем скрипте.

Dmitry.

19 (edited by kunar80 2014-11-20 20:06:02)

Re: Импорт файлов

Всё та же ошибка (см. рисунок). Выскакивает столько раз, сколько строчек в CSV.
Скрипт такой:

procedure frmChoice_bImportNAF_OnClick (Sender: string; var Cancel: boolean);
var
   OpenDialog: TOpenDialog;
   sl: TStringList;
   arrStr: array of string;

   i,c: integer;

   sid_sked: string; //опись
   sDocNum: string; //номер дела
   sDocName: string; //название
   sid_year: string; //год формирования
   sBeginDate: string; //дата начала
   sEndDate: string; //дата окончания
   sid_period: string; //срок хранения
   sPages: string; //количество страниц
   sid_room: string; //комната
   sid_scaff: string; //стеллаж
   sid_rack: string; //полка
   sNote: string; //примечание

   YY, MM, DD: string;
begin
     OpenDialog := TOpenDialog.Create(frmChoice);
     OpenDialog.InitialDir := 'd:\Archive 1.01\ImportCSV';
     if OpenDialog.Execute then
     begin
          sl := TStringList.Create;
          sl.LoadFromFile (OpenDialog.FileName); ///открытие файла

          c := sl.Count - 1;
          for i := 1 to c do
          begin
               arrStr := SplitString(sl[i], ';');

               //0 sid_sked
               if arrStr[0] <> '' then
               begin
                    sid_sked := SQLExecute ('SELECT id FROM sked WHERE sked LIKE "' + arrStr[0] +'"');
                    if sid_sked = '' then
                    begin
                         SQLExecute ('INSERT INTO sked (sked) VALUES ("'+ arrStr[0] +'");');
                         sid_sked := IntToStr(Last_Insert_id('sked'));
                         if sid_sked = '-1' then sid_sked := 'NULL';
                    end;
               end else sid_sked := 'NULL';

               //1 sDocNum
               if arrStr[1]<>'' then sDocNum := '"'+arrStr[1]+'"' else sDocNum := 'NULL';

               //2 sDocName
              if arrStr[2]<>'' then sDocName := '"' +  ReplaceStr(arrStr[2], '"', '') + '"' else sDocName := 'NULL'; //
 //              if arrStr[2]<>'' then sDocName := '"'+arrStr[2]+'"' else sDocName := 'NULL';

               //3 sid_year
               if arrStr[3] <> '' then
               begin
                    sid_year := SQLExecute ('SELECT id FROM year WHERE year LIKE "' + arrStr[3] +'"');
                    if sid_year = '' then
                    begin
                         SQLExecute ('INSERT INTO year (year) VALUES ("'+ arrStr[3] +'");');
                         sid_year := IntToStr(Last_Insert_id('year'));
                         if sid_year = '-1' then sid_year := 'NULL';
                    end;
               end else sid_year := 'NULL';


               //4 sBeginDate
               if arrStr[4]<>'' then
                  sBeginDate := '"'+ FormatDateTime('yyyy-MM-DD 00:00:00.000', StrToDate(arrStr[4])) + '"'
                  else sBeginDate := 'NULL';


               //5 sEndDate
               if arrStr[5]<>'' then
                  sEndDate := '"'+ FormatDateTime('yyyy-MM-DD 00:00:00.000', StrToDate(arrStr[5])) + '"'
                  else sEndDate := 'NULL';


               //6 sid_period
               if arrStr[6] <> '' then
               begin
                    sid_period := SQLExecute ('SELECT id FROM period WHERE period LIKE "' + arrStr[6] +'"');
                    if sid_period = '' then
                    begin
                         SQLExecute ('INSERT INTO period (period) VALUES ("'+ arrStr[6] +'");');
                         sid_period := IntToStr(Last_Insert_id('period'));
                         if sid_period = '-1' then sid_period := 'NULL';
                    end;
               end else sid_period := 'NULL';

               //7 sPages
               if arrStr[7]<>'' then sPages := '"'+arrStr[7]+'"' else sPages := 'NULL';

               //8 sid_room
               if arrStr[8] <> '' then
               begin
                    sid_room := SQLExecute ('SELECT id FROM room WHERE room LIKE "' + arrStr[8] +'"');
                    if sid_period = '' then
                    begin
                         SQLExecute ('INSERT INTO room (room) VALUES ("'+ arrStr[8] +'");');
                         sid_room := IntToStr(Last_Insert_id('room'));
                         if sid_room = '-1' then sid_room := 'NULL';
                    end;
               end else sid_room := 'NULL';

               //9 sid_scaff
               if arrStr[9] <> '' then
               begin
                    sid_scaff := SQLExecute ('SELECT id FROM scaff WHERE scaff LIKE "' + arrStr[9] +'"');
                    if sid_period = '' then
                    begin
                         SQLExecute ('INSERT INTO scaff (scaff) VALUES ("'+ arrStr[9] +'");');
                         sid_scaff := IntToStr(Last_Insert_id('scaff'));
                         if sid_scaff = '-1' then sid_scaff := 'NULL';
                    end;
               end else sid_scaff := 'NULL';

               //10 sid_rack
               if arrStr[10] <> '' then
               begin
                    sid_rack := SQLExecute ('SELECT id FROM rack WHERE rack LIKE "' + arrStr[10] +'"');
                    if sid_rack = '' then
                    begin
                         SQLExecute ('INSERT INTO rack (rack) VALUES ("'+ arrStr[10] +'");');
                         sid_rack := IntToStr(Last_Insert_id('rack'));
                         if sid_rack = '-1' then sid_rack := 'NULL';
                    end;
               end else sid_rack := 'NULL';

               //11 sNote
               if arrStr[11]<>'' then sNote := '"'+arrStr[11]+'"' else sNote := 'NULL';

               SQLExecute ('INSERT INTO one (id_sked, [docNum], [docName], id_year, [beginDate], [endDate], id_period, [pages], id_room, id_scaff, id_rack, [note]) VALUES ('+
               sid_sked +','+
               sDocNum +','+
               sDocName +','+
               sid_year +','+
               sBeginDate +','+
               sEndDate +','+
               sid_period +','+
               sPages +','+
               sid_room +','+
               sid_scaff +','+
               sid_rack +','+
               sNote +
               ');');

               frmChoice.Label8.Caption := IntToStr(i) + ' з ' + IntToStr(c);
               Application.ProcessMessages;
          end;

          sl.Free;
          UpdateDatabase('sked');
          UpdateDatabase('year');
          UpdateDatabase('period');
          UpdateDatabase('room');
          UpdateDatabase('scaff');
          UpdateDatabase('rack');
          frmChoice.TableGrid1.dbUpdate;
     end;
     OpenDialog.Free;
begin
     frmChoice.bSearch1.Click;  ////!!!!!Нажатие на кнопку ПОИСК (при этом видимые записи таблицы обновляются)
end;

end;

И ещё. Названия часто будут выглядеть примерно так:  Артель "Рога и копыта" кооператива "Золотой телёнок"  Как скриптом прописать расстановку кавычек именно так?

Post's attachments

Attachment icon 2014-11-20_213916.jpg 8.47 kb, 363 downloads since 2014-11-20 

Не боги горшки лепят!

Re: Импорт файлов

kunar80
Пришлите пожалуйста проект и файл, который пытаетесь импортировать, посмотрю в чем дело.

Dmitry.

Re: Импорт файлов

Спасибо. Ошибку не нашёл. Переписал заново. Работает. Вопрос по кавычкам актуален. Либо кавычки не пишутся вообще, либо записывается так: "Контора ""Роги та копита""". Как это записать, чтобы было Контора "Роги та копита"?

//3 sDocName
               if arrStr[3]<>'' then sDocName := '"' +  ReplaceStr(arrStr[3], '"', '""') + '"' else sDocName := 'NULL';
Не боги горшки лепят!

Re: Импорт файлов

kunar80
странно, не должно быть так, пришлите проект, так как в коде ошибку я найти не могу.

Dmitry.

Re: Импорт файлов

Застопорился на вычисляемом поле. Между 13 и 15 - вычисляемое значение destructionYear. В файле CSV колонка, конечно же, будет пустая.
Как это записать в приведенной ниже части скрипта?

               //13 sid_period
               if arrStr[13] <> '' then
               begin
                    sid_period := SQLExecute ('SELECT id FROM period WHERE period LIKE "' + arrStr[13] +'"');
                    if sid_period = '' then
                    begin
                         SQLExecute ('INSERT INTO period (period) VALUES ("'+ arrStr[13] +'");');
                         sid_period := IntToStr(Last_Insert_id('period'));
                         if sid_period = '-1' then sid_period := 'NULL';
                    end;
               end else sid_period := 'NULL';
/////ЗДЕСЬ
               //15 sid_room
               if arrStr[15] <> '' then
               begin
                    sid_room := SQLExecute ('SELECT id FROM room WHERE room LIKE "' + arrStr[15] +'"');
                    if sid_period = '' then
                    begin
                         SQLExecute ('INSERT INTO room (room) VALUES ("'+ arrStr[15] +'");');
                         sid_room := IntToStr(Last_Insert_id('room'));
                         if sid_room = '-1' then sid_room := 'NULL';
                    end;
               end else sid_room := 'NULL';


///И ЗДЕСЬ (вместо ?????????):
               SQLExecute ('INSERT INTO two (id_dept, [actNum], [actDate], [docNum], [docName], [docDate], id_type, [indexNum], [indexName], [folderNum], [internalNum], [pages], id_year, id_period, ?????????, id_room) VALUES ('+
               sid_dept +','+
               sActNum +','+
               sActDate +','+
               sDocNum +','+
               sDocName +','+
               sDocDate +','+
               sid_type +','+
               sIndexNum +','+
               sIndexName +','+
               sFolderNum +','+
               sInternalNum +','+
               sPages +','+
               sid_year +','+
???????????????????????
               sid_period +','+
               sid_room +
               ');');
Не боги горшки лепят!

Re: Импорт файлов

kunar80
Вы хотите записать данные в вычисляемое поле? это не возможно, его на самом деле не существует в таблице базы данных, это лишь результат вычисления на основе других полей.

Dmitry.

25 (edited by kunar80 2014-11-21 15:41:23)

Re: Импорт файлов

Нет! В таблице CSV колонка 14 без значений. Далее идут заполненные колонки. Как это прописать в скрипте? Ведь каждая колонка пронумерована. До этого момента всё грузится нормально. Не обращая внимания на наличие 14 колонки в гриде, пишу колонку 15 - id_room, и сразу же выдаёт ошибку синтаксиса.

Не боги горшки лепят!