Как организовать отбор данных по условию? ПО RAD Studio 10.1 Berlin. Всё работает, но нужно изменить код. А именно каким либо образом вынести условие из кода во внешний файл, для возможности его изменения. Пока же условие "вшито" в программу. Смысл программы - есть двумерный массив, который надо отфильтровать. (Своего рода таблица - упрощенно.) Массив состоит из 100 элементов и 50000 строк. Фильтрация осуществляется по первым 5-6 полям. Условия фильтрации равно, не равно, содержит, и, или. Условие совпало - нет ошибки, строка массива проходит. И всё это сейчас в коде программы. Но условия меняются. Как их значения, так иногда и логика - последовательность. Примерif ((A1='1') and (CountPos('A13.29',A2)>0) and (A3='73') and (A4='97') and (A5='3')) then error:=0; CountPos - функция поиска содержимого (содержит). А завтра может быть нужноif ((A1='222') and (CountPos('A13.29',A2)>0) or (A3='73') and (A4!='97') and (A5='3') and (A5<>'4')) then error:=0; Что не меняется. Названия переменных A1, A2...A6. Их максимальное количество - 6, т.е. A7 никогда не будет в коде. Вид условий. Внутри скобок, до ОПЕРАТОР не более 3х. Всего комбинаций "троек" условий не более 4х.if ( ((условие 1) оператор (условие 2) оператор (условие 3)) ОПЕРАТОР ((условие 1) оператор (условие 2) оператор (условие 3)) ОПЕРАТОР ((условие 1) оператор (условие 2) оператор (условие 3)) ОПЕРАТОР ((условие 1) оператор (условие 2) оператор (условие 3)) ) then begin end; Как организовать отбор данных по условию? Мысли идеи?
Для того чтобы вынести условия фильтрации из программы во внешний файл и обеспечить возможность их изменения, можно воспользоваться следующим подходом:
Создать текстовый файл, в котором будут записаны условия фильтрации в нужном формате, например:((A1='1') and (CountPos('A13.29',A2)>0) and (A3='73') and (A4='97') and (A5='3'))В программе реализовать считывание условий из этого файла и их применение для фильтрации массива.
Примерный код для чтения файла с условиями и их применения к массиву может выглядеть примерно так:
procedure FilterArray(const conditionsFile: string); var fileStream: TFileStream; conditions: TStringList; condition: string; i, j: Integer; begin fileStream := TFileStream.Create(conditionsFile, fmOpenRead); conditions := TStringList.Create; try conditions.LoadFromStream(fileStream); for i := 0 to conditions.Count - 1 do begin condition := conditions[i]; for j := 0 to 49999 do begin if EvaluateCondition(condition, Array[j]) then begin // Действия при совпадении условия end; end; end; finally conditions.Free; fileStream.Free; end; end;
Здесь EvaluateCondition - это функция, которая будет оценивать условие фильтрации для конкретной строки массива.
Таким образом, вы сможете легко изменять условия фильтрации, добавляя и изменяя их во внешнем файле, без необходимости менять код программы.
Для того чтобы вынести условия фильтрации из программы во внешний файл и обеспечить возможность их изменения, можно воспользоваться следующим подходом:
Создать текстовый файл, в котором будут записаны условия фильтрации в нужном формате, например:((A1='1') and (CountPos('A13.29',A2)>0) and (A3='73') and (A4='97') and (A5='3'))В программе реализовать считывание условий из этого файла и их применение для фильтрации массива.Примерный код для чтения файла с условиями и их применения к массиву может выглядеть примерно так:
procedure FilterArray(const conditionsFile: string);var
fileStream: TFileStream;
conditions: TStringList;
condition: string;
i, j: Integer;
begin
fileStream := TFileStream.Create(conditionsFile, fmOpenRead);
conditions := TStringList.Create;
try
conditions.LoadFromStream(fileStream);
for i := 0 to conditions.Count - 1 do
begin
condition := conditions[i];
for j := 0 to 49999 do
begin
if EvaluateCondition(condition, Array[j]) then
begin
// Действия при совпадении условия
end;
end;
end;
finally
conditions.Free;
fileStream.Free;
end;
end;
Здесь EvaluateCondition - это функция, которая будет оценивать условие фильтрации для конкретной строки массива.
Таким образом, вы сможете легко изменять условия фильтрации, добавляя и изменяя их во внешнем файле, без необходимости менять код программы.