Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.05.06;
Скачать: CL | DM;

Вниз

проблема при фильтрации   Найти похожие ветки 

 
gvozdkoff   (2012-01-05 19:40) [0]

Есть 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 "
Подскажите как это решить, пожалуйста


 
gvozdkoff   (2012-01-05 19:46) [1]

рассматривал как вариант занести все данные в базу (sqlite), используя ZEOS Access, а потом уже запросами.
Но это альтернативный вариант, особо не разбирался, остановился на том что dbgrid как  то странно отображает данные, во всех ячейках отображается надпись MEMO. На  этом и остановился


 
Сергей М. ©   (2012-01-05 19:49) [2]

Filter:= Format("10=%u", [160811]);


 
Sha ©   (2012-01-05 19:49) [3]

нельзя ли приблизительно описать цель?


 
Сергей М. ©   (2012-01-05 19:50) [4]

Filter:= Format("10="%u"", [160811]);


 
gvozdkoff   (2012-01-05 19:54) [5]


> Сергей М. ©   (05.01.12 19:50) [4]
> Filter:= Format("10="%u"", [160811]);

выдает одну пустую строку (( ,
но ошибка исчезла )


 
gvozdkoff   (2012-01-05 19:57) [6]


> Sha ©   (05.01.12 19:49) [3]
> нельзя ли приблизительно описать цель?

Вобщем, лог-файл GPS навигатора,в этот лог записываются координаты через каждые 30 секунд, записи дабавляются каждый день,
цель  - выборка по дате


 
Sha ©   (2012-01-05 20:11) [7]

> gvozdkoff   (05.01.12 19:57) [6]

почему нельзя строковые данные из лога
грузить в данные соответствующего типа?


 
Sha ©   (2012-01-05 20:12) [8]

в смысле нужного, TDateTime, например


 
Sha ©   (2012-01-05 20:14) [9]

и даже отбирать по дате (диапазону) можно в момент загрузки


 
Сергей М. ©   (2012-01-05 20:14) [10]


> выдает одну пустую строку


Значит в НД нет ни одной записи, содержащей в поле с именем "10" значение точно равное строке "160811"


> но ошибка исчезла


Ну так что просил - то и получил)


 
gvozdkoff   (2012-01-05 20:17) [11]


> Сергей М. ©   (05.01.12 20:14) [10]
>
> > выдает одну пустую строку
>
>
> Значит в НД нет ни одной записи, содержащей в поле с именем
> "10" значение точно равное строке "160811"
>
>
> > но ошибка исчезла
>
>
> Ну так что просил - то и получил)


)) ну да что просил , а если серьезно то, я сначала тоже подумал что нет записи в 10-м поле, специально посмотрел. ну ведь есть же такое!


 
Сергей М. ©   (2012-01-05 20:26) [12]


> ну ведь есть же такое


ага, есть)
вот такое "160811              "


 
gvozdkoff   (2012-01-05 20:30) [13]


> > ну ведь есть же такое
>
>
> ага, есть)
> вот такое "160811              "

а вот теперь совсем не понял, если я создаю поле размером 20, записываются туда данные в 6 символов, а все остальное пробелы чтоли, единственная догадка у меня


 
Сергей М. ©   (2012-01-05 20:37) [14]


> записываются туда данные в 6 символов


Не факт.
То что ты видишь 6 символов и не видишь прочие "пробельные" символы, вовсе не говорит о том что их там нет.

А вообще Sha (C) тебя пытается вразумить и наставить на путь вполне праведный - ты прислушался бы)


 
Dennis I. Komarov ©   (2012-01-05 21:10) [15]


> А вообще Sha (C) тебя пытается вразумить и наставить на
> путь вполне праведный - ты прислушался бы)

Эм, а как же быть героем? :)


 
gvozdkoff   (2012-01-05 21:25) [16]

Да я вот как раз рассматриваю вариант > Sha (C)


 
gvozdkoff   (2012-01-05 21:46) [17]

при создании поля в VirtualTable1, следует . видимо присвоить ему тип DateTime
VirtualTable1.AddField("10", ftDateTime, 0, false);
Далее этому полю присваиваем значения из столбца в Stingride
VirtualTable1.FieldByName("10").AsDateTime:=stringgrid1.cells[10,i];

здесь  выходит ошибка, если же делаю так
VirtualTable1.FieldByName("10").AsVariant:=stringgrid1.cells[10,i];

то дату 160811  в dbgride выводит как 13.04.2340


 
Sha ©   (2012-01-05 21:53) [18]

Все правильно:
160 тыщ дней = 440 лет
1900 + 440 = 2340


 
Сергей М. ©   (2012-01-05 21:59) [19]


> дату 160811  в dbgride выводит как 13.04.2340


Правильно выводит.
Откуда же ему знать что это дата ?
Ты сам должен подсуетиться, понатыкав в строку разделители между днем, месяцем и годом, перед тем как скармливать строку св-ву
VirtualTable1.FieldByName("10").Value


 
sniknik ©   (2012-01-05 22:31) [20]

+
имена цифрами не задаются... буква в начале минимум должна быть.


 
gvozdkoff   (2012-01-06 01:35) [21]

то есть, как я понял, нужно  строковое представление даты  перевести в значение типа TDateTime,
для этого как сказал

> Сергей М. ©
должен подсуетиться, понатыкав в строку разделители между днем, месяцем и годом, перед тем как скармливать строку св-ву
VirtualTable1.FieldByName("10").Value

значение каждой записи в поле "10"   разделить на dd.mm.yy, этим получиться строковое представление даты и потом все это дело перевести  в значение типа TDateTime.

А разделитель вставлять в stringgride или после того, как переместили все в Dbgrid?


 
Sha ©   (2012-01-06 01:52) [22]

а почему гридов 2, а не 3 ?


 
gvozdkoff   (2012-01-06 03:18) [23]

Вобщем не осилил я в гриде  понатыкать разделителей.
Сделал следующим образом.
Значения stringgrid1.Cols[10] сохранил в файл, а вот разделить строку  в файле мне уже знакомо.
текстовый файл получился такого вида
16.08.11
28.12.11
28.12.11
Затем снова подгружаю файл в stringgrid1.Cols[10].
Далее  работаем  c virtualtablу.
Кстати dBgrid отображает дату в формате 16.08.2011, то есть полностью год добавляется.
Запрос соответственно пишу так
VirtualTable1.Filter:="f10="16.08.2011"";


 
gvozdkoff   (2012-01-06 03:41) [24]

И еще вопросик, не могу додумать до конца как сделать выборку в интервале дат, варианты
либо с еdit.text вводить в ручную, но опять же нужно знать какие даты есть
либо с ComboBox1, в который загружаются значения из файла с датами.
Тут снова не все хорошо, так как одна и таже дата может повторятся десятки и сотни раз.
Подумал о группировке по дате. подскажите, пожалуйста, как это можно реализовать?


 
Sha ©   (2012-01-06 09:06) [25]

я первый спросил


 
gvozdkoff   (2012-01-06 12:07) [26]


> Sha ©   (06.01.12 09:06) [25]
> я первый спросил
))
в первый stringlist я загружаю данные из csv, а в dbgride вывожу результат чтобы было видно что у меня получается а что нет, и сравниваю гриды, где у меня произошло искажение данных. вот например как с датой, было 160811 а стало 13.04.2340


 
Sha ©   (2012-01-06 12:15) [27]

Я правильно понял, пользователь будет проверять, нет ли в программе ошибок?


 
gvozdkoff   (2012-01-06 12:31) [28]

пользователь  не будет проверять есть ли ошибки в программе,  в дальнейшем для пользователя dbgrid будет visible:=false;
dbgrid я использую для себя , чтобы проверить например фильтрацию, и если отфильтровано по дате правильно, то пользователь получит координаты GPS за этот интервал  дат либо за дату.
А координаты будут либо в текстовом файле, а хотя можно и в гриде, сделав columns[i].visible:=fasle;


 
sniknik ©   (2012-01-06 12:31) [29]

> Кстати dBgrid отображает дату в формате 16.08.2011, то есть полностью год добавляется.
кстати это зависит от локальных настроек системы, вполне может быть и так 08.16.2011 и так 08.16.11. закладываться на изменяемый формат строкового представления нельзя...  если конечно прога не "одного компьютера". тогда пофигу.


 
gvozdkoff   (2012-01-06 12:35) [30]


> sniknik ©   (06.01.12 12:31) [29]
> > Кстати dBgrid отображает дату в формате 16.08.2011, то
> есть полностью год добавляется.
> кстати это зависит от локальных настроек системы, вполне
> может быть и так 08.16.2011 и так 08.16.11. закладываться
> на изменяемый формат строкового представления нельзя...
>  если конечно прога не "одного компьютера". тогда пофигу.
>

вообще прога пишется не для массового распространения , а как вы и сказали для "одного компьютера", и честно говоря с датами вот не тестировал


 
Sha ©   (2012-01-06 12:42) [31]

Удалено модератором
Примечание: дубль


 
Sha ©   (2012-01-06 12:42) [32]

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

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


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

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


 
Sha ©   (2012-01-06 12:59) [34]

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

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

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


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

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


 
Sha ©   (2012-01-06 13:12) [36]

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

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


 
MsGuns ©   (2012-01-06 14:11) [37]

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


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

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


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


> 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");
сохраняется результат после фильтрации,
в тхт  формате кривовато правдо


 
Anatoly Podgoretsky ©   (2012-01-06 18:28) [40]

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

Безнадега.



Страницы: 1 2 вся ветка

Текущий архив: 2012.05.06;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.005 c
2-1325856082
Gu
2012-01-06 17:21
2012.05.06
messagebox


15-1325519052
Псарь
2012-01-02 19:44
2012.05.06
Как сделать поиск ТОЛЬКО по буржунету?


4-1256386078
GreyWolf
2009-10-24 16:07
2012.05.06
Аналог GetExceptionInformation в Delphi


15-1325241253
Jeer
2011-12-30 14:34
2012.05.06
С наступающим Новым Годом, друзья !


2-1325799180
Gu
2012-01-06 01:33
2012.05.06
опции компилятора