![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проблема при фильтрации [D7, XP]
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) до глаз пользователя?