Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.05.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





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


2-1325423630
Andvitar
2012-01-01 17:13
2012.05.06
как сделать ссылку на сайт в форме


2-1325795317
Gu
2012-01-06 00:28
2012.05.06
stdcall


6-1255871408
VASILII250288
2009-10-18 17:10
2012.05.06
Интернет


2-1325855150
Anthony
2012-01-06 17:05
2012.05.06
Иконка для приложения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский