Фильтр одномерного и двухмерного СОМ-массива (VARIANT)
Показов 1342
Комментарии 0
Фильтр одномерного и двухмерного СОМ-массива (тип данных VARIANT) с любым количеством столбцов, с любым количеством условий. Реализован параллельный алгоритм фильтрации (поддержка любого количества логических процессоров). Часть библиотеки BedvitCOM (начиная с v2.0.1.0, в XLL c v3.2.1.0) ArrayFilterV(VARIANT* array_in, VARIANT* array_parameters, VARIANT_BOOL array_out_index, VARIANT* array_out) 1. array_in - массив входящий (одномерный, двухмерный), тип данных VARIANT. 2. array_parameters - массив задаваемых параметров, тип данных VARIANT (6 параметров для одного условия, можно для одного и того же столбца, можно для разных). Количество условий не ограничено. Условия можно создать из списка, можно создать двухмерный массив и заполнить, можно забрать сразу с листа Excel. 3. array_out_index - режим вывода: 0- отфильтрованный массив, 1-массив индексов 4. array_out - массив результатов Условия в массиве параметров применяются в порядке следования, если нет скобок или внутри скобок. Скобки задают приоритет выполнения условий (стандартно), потом "И" и "ИЛИ" в порядке очередности. Параметры массива условий (сделал максимально близко к стандартной записи условий) - 6 параметров для каждой строки условия: 1.Логические операторы (0-ИЛИ, 1-И). Для первого условия можно не указывать. 2.Скобки открывающие (если нужны, можно несколько) 3.Столбец для фильтрации 4.Операторы сравнения (для сравнения значения заданного столбца со значением фильтра): 1 - меньше (для числа), 2 - равно (для числа и строки), 4 - больше (для числа), 8 - содержит подстроку (для строки), 16 - зарезервированное значение (регулярки), 32 - игнорировать регистр (для строки) , 64 - зарезервированное значение (basic), 128 - зарезервированное значение (extended), 256 - LIKE (пока только знак подстановки "*")(для строки) (начиная с v3.5, в XLL c v4.6) полноценный Like (бинарный режим) 512-НЕ (для числа и строки) Реализовано в виде бинарной маски, т.е. можно складывать, к примеру 8+512 - НЕ содержит подстроку, 1+2 - меньше или равно и т.д. 5.Значение фильтра (для фильтрации) 6.Скобки закрывающие (если нужны, можно несколько) т.е. для каждого условия 6 параметров: И/ИЛИ,(((...,стобец, оператор сравнения, значение, ...))) Условия можно задавать как простые: 'фильтр по первому столбцу, значение = 9 Array(,,1, 2, 9, "") так и более сложные, к примеру (см.рис.) Array(,"(((", 1, Содержит, "маша", , ИЛИ, , 1, Содержит, "вася", ")", И, , 1, НеРавно, "маша иванова", ")", ИЛИ, "(", 2, НеРавно, "'1", , ИЛИ, , 2, Равно, 1, "))", И, "(", 3, БольшеРавно, 12.5, , И, , 3, МеньшеРавно, 55.8, ")") или в таком виде (как удобнее). В примере для операторов сравнения созданы псевдонимы (в виде слова, по факту это банарная маска, см. выше) Array( _ ,"(((", 1, Содержит, "маша", , _ ИЛИ, , 1, Содержит, "вася", ")", _ И, , 1, НеРавно, "маша иванова", ")", _ ИЛИ, "(", 2, НеРавно, "'1", , _ ИЛИ, , 2, Равно, 1, "))", _ И, "(", 3, БольшеРавно, 12.5, , _ И, , 3, МеньшеРавно, 55.8, ")" _ ) Тайминги: фильтрация 10 млн. строк с найденными 5 млн. = 0,2 секунды Простые примеры (с замером скорости на 10 млн строк) и сложные (с выводом условий и результата):
|
Размещено в Без категории
Всего комментариев 0
Комментарии