фильтрация данных, загруженных из txt файла в stringgrid

ребята!

У меня есть этот текстовый файл, и я хочу загрузить содержимое в сетку строк. Вот мой код:

procedure PopulateStringGrid(Grid: TStringGrid; const FileName: string);
var
  TextFile, Line: TStringList;
  Row, col: Integer;
begin

  Grid.RowCount := 0;//clear any previous data
  TextFile := TStringList.Create;
  try
    Line := TStringList.Create;
    try
      Line.Delimiter := ' ';
      TextFile.LoadFromFile(FileName);
      Grid.RowCount := TextFile.Count;
      for Row := 0 to TextFile.Count-1 do
      begin
        Line.DelimitedText := TextFile[Row];
        for Col := 0 to Grid.ColCount-1 do
          if Col<Line.Count then
            Grid.Cells[Col, Row] := Line[Col]
          else
            Grid.Cells[Col, Row] := '0';
      end;
    finally
      Line.Free;
    end;
  finally
    TextFile.Free;
  end;
end;

procedure TForm5.sButton1Click(Sender: TObject);
var filename1:string;
begin
if opendialog1.Execute then
begin
sedit1.Text:=opendialog1.FileName;
filename1:=sedit1.Text;
PopulateStringGrid(StringGrid1, FileName1);
showmessage(filename1);
end
else showmessage('file failed to load');
end;

Это работает хорошо, но данных слишком много, поэтому я хочу использовать данные, которые мне нужны. Мне нужно получить данные в диапазоне дат. вот картинка для объяснения: STRINGGRID

Я хочу показывать данные только в диапазоне дат, которые я выбираю в dateedit вверху. Любая идея, как это сделать? Заранее спасибо! Я использую для этого delphi 7.


person mizkyd    schedule 22.09.2020    source источник


Ответы (1)


Похоже, что дата, хранящаяся в текстовых файлах, имеет формат ГГГГ-ММ-ДД, вы можете сравнивать даты, как строки (порядок строки такой же, как дата).

Вы должны добавить два аргумента в свою функцию PopulateStringGrid:

procedure PopulateStringGrid(
    Grid: TStringGrid; 
    const FileName: string;
    const DateFrom: string;
    const DateTo: String);

Когда вы вызываете PopulateStringGrid, вы передаете дату из двух полей даты:

PopulateStringGrid(StringGrid1, FileName1, 
                   FormatDateTime('YYYY-MM-DD', DateFrom.Date),
                   FormatDateTime('YYYY-MM-DD', DateTo.Date));

Наконец, в цикле PopulateStringGrid проверьте номер столбца, содержащего дату, и проверьте диапазон дат, а также сохраните другой номер строки для сетки, поскольку некоторые строки не добавляются. В конце зафиксируйте количество строк на точное найденное количество строк:

procedure PopulateStringGrid(
    Grid: TStringGrid; 
    const FileName: string;
    const DateFrom: string;
    const DateTo: String);
var
  TextFile, Line: TStringList;
  Row, col: Integer;
  RowGrid : Integer;
begin
  Grid.RowCount := 0;//clear any previous data
  TextFile := TStringList.Create;
  try
    Line := TStringList.Create;
    try
      Line.Delimiter := ' ';
      TextFile.LoadFromFile(FileName);
      Grid.RowCount := TextFile.Count;
      RowGrid := 0;
      for Row := 0 to TextFile.Count-1 dobegin
        Line.DelimitedText := TextFile[Row];
        if (Line[COL_WITH_DATE] >= DateFrom) and
           (Line[COL_WITH_DATE] <= DateTo) then begin
            for Col := 0 to Grid.ColCount-1 do begin
              if Col<Line.Count then
                Grid.Cells[Col, RowGrid] := Line[Col]
              else
                Grid.Cells[Col, RowGrid] := '0';
            end;
            Inc(RowGrid);
        end;
      end;
      Grid.RowCount := RowGrid;
    finally
      Line.Free;
    end;
  finally
    TextFile.Free;
  end;
end;

Этот код вылетел из моей головы. Я не тестировал это! Примечание. Может быть, более эффективно изменить RowCount сетки в каждой строке, чем предварительно выделить достаточное количество строк для всего и настроить в конце, как я сделал.

person fpiette    schedule 22.09.2020
comment
привет, твой ответ очень полезен! Это сработало, но у меня был такой случай. скажем, мне нужен диапазон данных с 20 августа 2020 года по 21 августа 2020 года. файл также состоит из данных от 19-08-2020. поэтому моя stringgrid вернет пустую сетку столько же, сколько файл 19-08-2020. как я могу сделать так, чтобы пробелы не отображались, а моя сетка строк отображала только нужные данные? Большое спасибо! - person mizkyd; 23.09.2020
comment
@mizkyd, твой ответ действительно полезен! Это сработало. Пожалуйста, отметьте ответ как принятый (галочка слева от ответа). - person fpiette; 15.10.2020
comment
@mizkyd Извините, я не понимаю ваш последний комментарий. Мой код добавляет только строку сетки для данных в диапазоне. Может быть, вы сделали небольшую ошибку, копируя/адаптируя мой код? - person fpiette; 15.10.2020