1 (edited by Роман 2015-11-17 08:37:15)

Topic: импорт...

Доброго времени суток Дмитрий!   версия 2.1
Взял скрипт из вашего примера по валютам и корректирую под свой нужды:

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 обновить данные
          ShowMessage('Импорт завершен');
     end;
     OpenDialog.Free; // уничтожаем объект, после работы с ним
end;

Моя проблема заключается в том,что...
когда в CSV файле для импорта в колонки(их там три) попадает пустая клетка-ЭТО НОРМАЛЬНО!
но когда в CSV файле для импорта в колонки попадают в дату, название валют или кодировки
другой текст не имеющий отношения к  дате, названию валют или кодировкам программа начинает ругаться...
Вопрос:
1.   возможно ли разрешить импортировать даже если они попадаются ?
2.   возможно ли разрешить импортировать, но тогда без них?
3.   возможно ли разрешить импортировать, только те строчки,
      в которых присутствует валюта в родительской таблице? если на 3. ДА подскажите куда, где, и  что дописать?
Для меня это ВАЖНО! (любой вариант меня устроит... лишь бы с импортировать, P/S предпочтительно 3. пункт вопроса!!!)
если на 3. вопрос НЕТ...тогда 1.вариант или 2.вариант...
а в гриде я им устрою фильтр...указав какие строчки показывать с помощью ComboBox привязанному к  названию валют...

                                                                                                  С Уважением и Благодарностью Роман!!!

2 (edited by Роман 2015-11-17 07:32:15)

Re: импорт...

приложил файл в екселе указав цветом строчки какие меня интересуют...

Post's attachments

Attachment icon образец в екселе....xlsx 12.98 kb, 530 downloads since 2015-11-17 

Re: импорт...

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

Dmitry.

4 (edited by Роман 2015-11-18 17:57:51)

Re: импорт...

ок...ответ понятен.................(мы лёгких путей не ищем....)
из ходя из этого имеется следующий вопрос..........
есть ли следующая возможность .............

имеется таблица...в ней поле текст...в ней  запись даты как текст....
Вопрос:
есть ли возможность.....кликаем по строчки в гриде.....из поля текст(где запись 30.09.2015 13:51)
вывести запись в DateTimePicker(для даты) и в DateTimePicker(для время) эти данные....для записи в другую таблицу..

к примеру как это можно сделать с Edit....

procedure Form2_TableGrid1_OnCellClick (Sender: string; ACol, ARow: Integer);
begin
      //клик по строчки в гриде...подставляет значения в Edit
     Form2.Edit4.Text := Form2.TableGrid1.Cells[1, ARow];
   end;
так же и для (где записи 30.09.2015 13:51)???????

                                               С Уважением и Благодарностью Роман!!!

Re: импорт...

судя по вопросу, вы пытаетесь сделать что то странное, с этим не смогу помочь, если CSV файл может содержать ошибки, то необходимо их обнаруживать с помощью скрипта по время импорта и соответственно обрабатывать данную ошибку.

Dmitry.

6 (edited by Роман 2015-11-19 15:17:25)

Re: импорт...

Доброго времени суток Дмитрий!

Попробую описать суть своей проблемы:
У меня есть файл CSV(Рисунок приложен выше) в нём в колонках,
где имеется дата находятся другие значения как текст и другие, разные числа..."вобщем мусор" который не относиться к дате !

Варианты:
1) во время импорта используя скрипт.... указать, чтоб в таблицу с поле "дата/время" загружалась
только дата со временем............. остальной МУСОР  игнорировался.........
Ваш ответ:

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

   а) Приводить в порядок  файл CSV самому до импорта НЕТ СМЫСЛА......их за день может быть много..................................
   б) С помощью скрипта...если такое имеет место быть...подскажите? сам скрипт для импорта в самом начале поста...........
я расценил Ваш ответ как: с помощью скрипта это нельзя сделать, только самому до импорта..............
"самому до импорта"  МЕНЯ ТАК НЕ УСТРАИВАЕТ.......ищем другие способы

Следующий Вариант:
2)  импортируем  всё в месте с "мусором"  в базу с полями как текст
   а) .....отсюда и появился пост №4
   б) кликаем по гриду два раза появляется форма (показать запись)
         и этот текст (30.09.2015 13:51) был в DateTimePicker(для даты) и в DateTimePicker(для время)  для записи с поле "дата/время"
   б) может через вычислительное поле........

СУТЬ Варианта 2 :текст(30.09.2015 13:51) вставить в  DateTimePicker(для даты) и в DateTimePicker(для время)

если есть способ решения по варианту 1, тогда вариант 2 вообще не нужен......

          С Нетерпением жду ответа......

Re: импорт...

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

Dmitry.

8 (edited by Роман 2015-11-19 16:21:52)

Re: импорт...

приложил проект...помогите с импортом файла
в файле прописано проблема................................

С Уважением и Благодарностью Роман!!!

Post's attachments

Attachment icon импорт.zip 340.77 kb, 514 downloads since 2015-11-19 

Re: импорт...

Роман
Как я уже сказал, могу помочь только с конкретным вопросом, в вашем случае это займет слишком много времени и выходит за рамки помощи.

Dmitry.

Re: импорт...

Доброго времени суток Дмитрий!
Попробую задать конкретный вопрос: Имея скрипт который описан в самом начале.....(пост №1)
Что надо дописать?...чтоб в таблицу произвелась запись тех строчек...в которых присутствует значения из словаря!
т.е. пройтись по всем строчкам csv файла, который загрузили в объект sl (TStringList)...выбрать только те строчки,
где присутствуют значения из словаря....остальные строчки будут "False"
На основании этого уже сделать запись в таблицу.

если это не займёт у Вас слишком много времени и не выйдет за рамки помощи.

                                                                        С Уважением и Благодарностью Роман!!!

Re: импорт...

Доброго времени суток !
взял пример с проектом сделанный Дмитрием...
http://myvisualdatabase.com/forum/viewtopic.php?id=594
пытаюсь его переделать, чтоб при импорте...импортировались только те строчки
в которых присутствуют значения из словаря....,если в строчки нет значения из словаря.....
значит вся строчка не импортируется......................................................................................................
Добрые люди...если кто-то делал подобное подскажите,что в скрипте надо добавить или изменить?
Три дня и три ночи "колдовства" результата не дало, не хватает моих знаний............................................
Буду рад любой подсказки...

                                                                                              С Уважением и Благодарностью Роман!!!

Re: импорт...

перед кодом

     arrStr := SplitString(sl[i], ';'); // sl[i] возвращает строку из csv файла, которую функция SplitString разделяет на столбцы. В данном csv файле в качестве разделителя столбцов используется знак ;

ставим

               if StrToInt(PegMach(sl[i]))>0  then
               begin
 // здесь действия добавление в БД 
               end;

 // добавляем функцию (нужно доделать проверку даты)
 // но сама логика думаю понятна
function PegMach(Str: string): string;
 var
 arrStr: array of string;
 err : integer=0;
begin
   arrStr := SplitString(Str, ';'); // разбиваем строку (Str[0-2]) на массив (arrStr)
   // Str[0] - первое поле  Str[1]  второе поле Str[3]-третье поле
   if (arrStr[1]<>'sell') or (arrStr[1]<>'buy') then   err:=1;  // sell или buy
   // не хватает проверки даты первого поля  Str[0] 
   if  err<1  then Result := '0'
   else
   Result := '1';
end;

13 (edited by Роман 2015-11-22 19:57:29)

Re: импорт...

Огромное спасибо fleshkyru за отклик!
Моя попытка прикрутить это к скрипту была безуспешной...
ошибка за ошибкой...

(нужно доделать проверку даты)

если в строчке... второе поле(buy или sell)-значит всю строчку импортируем......(в поле дата всегда правильная дата)
если в строчке... второе поле(нет этих значений)-значит всю строчку удалить,игнорировать(в поле дата может быть текст)
если эта строчка удалиться...не совсем понятно для меня, зачем её проверять?
НЕ ХВАТАЕТ МНЕ ЗНАНИЙ...........................
Если Вас не обременит, помогите эти две записи в скрипте объединить..Пожалуйста....

                                                                                         С Уважением и Благодарностью Роман!!!

Post's attachments

Attachment icon импорт....zip 341.16 kb, 519 downloads since 2015-11-22 

Re: импорт...

Роман

после этой строки

arrStr := SplitString(sl[i], ';'); // sl[i] возвращает строку из csv файла, которую функция SplitString разделяет на столбцы. В данном csv файле в качестве разделителя столбцов используется знак ;

вставьте эту

if (arrStr[1]<>'buy') and (arrStr[1]<>'sell') then continue;
Dmitry.

Re: импорт...

Доброго времени суток!
Урррррааааааааааааа!...Работает!
до конечной цели долековато...но зато лёд тронулся.....
Огромное спасибо "fleshkyru" за отклик......................
и конечно же Вам Дмитрий...моим восхищением программой нет придела....

                                                             С Уважением и Благодарностью Роман!!!

Re: импорт...

Доброго времени суток!
Спортивный интерес...
HTML Document (.htm) импортировать другим способом можно???,
кроме  SQLiteStudio,а главное не преобразуя его в  CSV формат, т.е сразу напрямую..
кликнули на HTML Document (.htm) и он уже в базе MVD???

Re: импорт...

Роман wrote:

Доброго времени суток!
Спортивный интерес...
HTML Document (.htm) импортировать другим способом можно???,
кроме  SQLiteStudio,а главное не преобразуя его в  CSV формат, т.е сразу напрямую..
кликнули на HTML Document (.htm) и он уже в базе MVD???

Можно получить текст html страницы с помощью функции s := HTTPGet('url страницы'); затем с помощью строковых функций находить и извлекать необходимые данные, которые можно вставить в базу с помощью SQL запроса.

Dmitry.

Re: импорт...

Дмитрий...я конечно же чуток " поднатарел " на форуме...НО...
прошу прощения У Вас, не будет любого проект-примера???,
а то у меня глаза загорелись...(Вы сказали можно,а я не совсем понял как это выглядит...)
С Уважением и Благодарностью Роман!!!

Re: импорт...

Друзья.....
у кого нибудь есть проект-пример на ПОСТ №17 или ПОСТ №18???
С Уважением и Благодарностью Роман!!!