Форум: "Начинающим";
Текущий архив: 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;
Результат отображается в DbGRIDDBGrid1.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);
Далее этому полю присваиваем значения из столбца в StingrideVirtualTable1.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, либо в xmlVirtualTable1.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.004 c