Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

проблема при фильтрации [D7, XP]


Страницы:   1 2 3

gvozdkoff ©   (2012-01-05 19:40:00) 

Есть csv файл,
нужно отфильтровать в этом файле записи по дате (формат записи даты 160811 ), либо по интервалу дат, следовательно нужно будет делать группировку по дате, чтобы найти неповторяющиеся значения

нашел процедуру , которая выводит этот файл в stringgrid


procedure ReadTabFile(FN: TFileName; FieldSeparator:
Char; SG: TStringGrid);
var
 i: Integer;
 S: string;
 T: string;
 Colonne, ligne: Integer;
 Les_Strings: TStringList;
 CountCols: Integer;
 CountLines: Integer;
 TabPos: Integer;
 StartPos: Integer;
 InitialCol: Integer;
begin
 Les_Strings := TStringList.Create;
 try
   // Load the file, Datei laden
   Les_Strings.LoadFromFile(FN);

   // Get the number of rows, Anzahl der Zeilen ermitteln
   CountLines := Les_Strings.Count + SG.FixedRows;

   // Get the number of columns, Anzahl der Spalten ermitteln
   T := Les_Strings[0];
   for i := 0 to Length(T) - 1 do Inc(CountCols,
   Ord(IsDelimiter(FieldSeparator, T, i)));
   Inc(CountCols, 1 + SG.FixedCols);

   // Adjust Grid dimensions, Anpassung der Grid-Gro?e
   if CountLines > SG.RowCount then SG.RowCount := CountLines;
   if CountCols > SG.ColCount then SG.ColCount := CountCols;

   // Initialisierung
   InitialCol := SG.FixedCols - 1;
   Ligne := SG.FixedRows - 1;

   // Iterate through all rows of the table
   // Schleife durch allen Zeilen der Tabelle
   for i := 0 to Les_Strings.Count - 1 do
   begin
     Colonne := InitialCol;
     Inc(Ligne);
     StartPos := 1;
     S := Les_Strings[i];
     TabPos := Pos(FieldSeparator, S);
     repeat
       Inc(Colonne);
       SG.Cells[Colonne, Ligne] := Copy(S, StartPos, TabPos - 1);
       S := Copy(S, TabPos + 1, 999);
       TabPos := Pos(FieldSeparator, S);
     until TabPos = 0;
   end;
 finally
   Les_Strings.Free;
 end;
end;


Далее использую VirtualTable из компонента MyDAC.
Это чтобы отфильтровать по дате
При создании формы создаю поля для VirtualTable
Тип поля STRING

procedure TForm1.FormCreate(Sender: TObject);
begin
  VirtualTable1.Open;
VirtualTable1.Clear;

VirtualTable1.AddField('1', ftString, 20, false);
VirtualTable1.AddField('2', ftString, 20, false);
VirtualTable1.AddField('3', ftString, 20, false);
VirtualTable1.AddField('4', ftString, 20, false);
VirtualTable1.AddField('5', ftString, 20, false);
VirtualTable1.AddField('6', ftString, 20, false);
VirtualTable1.AddField('7', ftString, 20, false);
VirtualTable1.AddField('8', ftString, 20, false);
VirtualTable1.AddField('9', ftString, 20, false);
VirtualTable1.AddField('10', ftString, 20, false); //  это поле будет отображать дату

Ну  и начинаю заполнять VirtualTable из StringGrid

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
ReadTabFile('log.csv', ',', StringGrid1); // заполняю StringGrid1 из csv файла
VirtualTable1.Clear;
virtualtable1.Active:=true;
  for i:=1 to form1.StringGrid1.RowCount-1  do
begin
  VirtualTable1.Append;
 VirtualTable1.Edit;
 VirtualTable1.FieldByName('1').AsString:=stringgrid1.cells[1,i];
 VirtualTable1.FieldByName('2').AsString:=stringgrid1.cells[2,i];
 VirtualTable1.FieldByName('3').AsString:=stringgrid1.cells[3,i];
 VirtualTable1.FieldByName('4').AsString:=stringgrid1.cells[4,i];
 VirtualTable1.FieldByName('5').AsString:=stringgrid1.cells[5,i];
 VirtualTable1.FieldByName('6').AsString:=stringgrid1.cells[6,i];
 VirtualTable1.FieldByName('7').AsString:=stringgrid1.cells[7,i];
 VirtualTable1.FieldByName('8').AsString:=stringgrid1.cells[8,i];
 VirtualTable1.FieldByName('9').AsString:=stringgrid1.cells[9,i];
 VirtualTable1.FieldByName('10').AsString:=stringgrid1.cells[10,i]; //  это поле будет отображать дату
 VirtualTable1.post;
VirtualTable1.Refresh;
 end;

Результат отображается в DbGRID
DBGrid1.DataSource:=DataSource1
DataSource1.DataSet:=VirtualTable1
До это момента ошибок пока не наблюдалась, а сейчас сортирую по полю

VirtualTable1.Filter:='10="inttostr(160811)"';
VirtualTable1.Filtered := True;

И вот здесь выдает ошибку  " could not convert variant of type string into type double "
Подскажите как это решить, пожалуйста


sniknik   (2012-01-07 12:34:00) [1]

убеждали убеждали на протяжении всей ветки, что "обвязки" типа стрингрида, и вообще визуализация нафиг не нужны, и вот оказывается не убедили... он от них конечно отказался, но не из-за убеждений, а из-за того, что "пошел другим путем"...

> 7 300 строк, так же 13 столбцов
обработка такого мизерного количества по логике
Sha ©   (06.01.12 19:30) [41]
займет много меньше секунды...


Anatoly Podgoretsky   (2012-01-07 10:28:00) [2]

> gvozdkoff  (07.01.2012 00:45:49)  [49]

Но меньше чем здесь.


gvozdkoff   (2012-01-07 00:45:00) [3]

там что то много понаписано читать не стал ))


Sha   (2012-01-07 00:41:00) [4]

вежливый вариант этого   http://www.delphimaster.ru/cgi-bin/forum.pl?id=1325080645&n=18


gvozdkoff   (2012-01-07 00:24:00) [5]

Господа, извиняюсь что не сообщил, но я пошел другим путем, импортировал лог-файл в sqllite, объясню почему, тестировал я на файле размером 641 байт, это 8 строк, 13 столбцов, и при импорте из csv в stringlist это занимало очень мало времени, но решил импортировать с другого Gps -источника, лог-файл 578 кб, это 7 300 строк, так же 13 столбцов, ну и тут то я понял что не вариант, я уже и чайник вскипятить успел и заварку кипяточком залил, и тут стринггрид вдруг заполнился данными,

Всем огромное спасибо за участие и помощь. и самое главное за терпение


Anatoly Podgoretsky   (2012-01-06 20:15:00) [6]


> Мы умирает видно. Двоит, собака. После СНГ новую надо купить.

Купи Я


Андреевич   (2012-01-06 19:53:00) [7]

и клавиатура =)


Sha   (2012-01-06 19:31:00) [8]

* Мышь


Sha   (2012-01-06 19:31:00) [9]

Мы умирает видно. Двоит, собака. После СНГ новую надо купить.


Sha   (2012-01-06 19:30:00) [10]

Удалено модератором


Sha   (2012-01-06 19:30:00) [11]

> gvozdkoff

Тебя пытаются подвести к следующей мысли.

Для каждой считанной записи входного файла делаешь:
- находишь ее дату в строковом виде;
- переводишь ее в TDateTime или японский вид ('20110131');
- проверяешь попадание в заданный диапазон;
- при попадании копируешь запись в выходной файл.

Нафиг здесь все эти решетки, таблицы, фильтры.


Anatoly Podgoretsky   (2012-01-06 18:28:00) [12]

> gvozdkoff  (06.01.2012 18:19:39)  [39]

Безнадега.


gvozdkoff   (2012-01-06 18:19:00) [13]


> Sha ©   (06.01.12 13:12) [36]
> Тогда изменю вопрос [32]:
>
> Допустим программа уже написана и в ней нет никакого dbgrid.
>
> Опиши путь и преобразования данных от исходного файла (с
> 160811)
> до твоих глаз и до файла, который получит пользователь.

например так, после фильтрации по дате

VirtualTable1.Filter:='f10="16.08.2011"';
VirtualTable1.Filtered := True;


тут варианты , либо в txt, либо в xml
VirtualTable1.SaveToXML('1.xml');
сохраняется результат после фильтрации,
в тхт  формате кривовато правдо


gvozdkoff   (2012-01-06 18:05:00) [14]

ну господа,  с сетками для меня понятнее как то


MsGuns   (2012-01-06 14:11:00) [15]

Если данные цсв не будут отображаться зафик там вообще какие-то сетки ?


Sha   (2012-01-06 13:12:00) [16]

Тогда изменю вопрос [32]:

Допустим программа уже написана и в ней нет никакого dbgrid.
Опиши путь и преобразования данных от исходного файла (с 160811)
до твоих глаз и до файла, который получит пользователь.


gvozdkoff   (2012-01-06 13:04:00) [17]

dbgrid для меня, я ведь уже писал, только на момент написания программы, пользователь будет выбирать только дату либо диапазон дат, из файла, который создается после загрузки csv в  stringgrid, и  затем пользователь получит файл к примеру с соответствующими координатами


Sha   (2012-01-06 12:59:00) [18]

> gvozdkoff   (06.01.12 12:31) [28]
> в дальнейшем для пользователя dbgrid будет visible:=false;

> gvozdkoff   (06.01.12 12:56) [33]
> так ведь dbgrid только  отображает данные

Вот это понять не могу


gvozdkoff   (2012-01-06 12:56:00) [19]

так ведь dbgrid только  отображает данные, в проекте используется virtualtable. у которого есть свойство filter, или я ошибаюсь?


Sha   (2012-01-06 12:42:00) [20]

Я не понял, как и где будет работать фильтрация при невидимом dbgrid.

Можно описать путь и преобразования данных
от исходного файла (с 160811) до глаз пользователя?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо