Ускорить/оптимизировать поиск по таблице в C#

Devostator

Client
Регистрация
17.09.2011
Сообщения
262
Благодарностей
25
Баллы
28
Всем привет.

Подскажите пожалуйста кто знает, можно ли ускорить выполнение кода?

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

Сейчас скрипт по каждой фразе отрабатывает секунд за 5-10. Но фраз в задаче может быть 1000, что сильно увеличивает время выполнения.

C#:
// берем регулярное выражение для парсинга из переменной
var parserRegexPattern = project.Variables["task_phrase_word_1"].Value;
var parserRegex = new System.Text.RegularExpressions.Regex(parserRegexPattern);
// получаем таблицу, в которой будем искать
var sourceTable = project.Tables["база"];
// получаем таблицу, в которую будем класть
var destTable = project.Tables["база"];
// ищем в каждой строчке в таблице

for(int i = 0; i < sourceTable.RowCount; i++)
{
    // читаем строку из таблицы (это будет массив ячеек)
    var cells = sourceTable.GetRow(i).ToArray();      

    // Проверяем длину массива cells
    if (cells.Length > 6 && cells[6] != null)
    {
        // Игнор регистра -- приводим значение нужной ячейки к нижнему регистру
        cells[6] = cells[6].ToLower();

        // Проверяем ячейку регулярным выражением, если есть совпадение кладем результат во вторую таблицу
        if (parserRegex.IsMatch(cells[6]))
            destTable.AddRow(cells);
    }
}
 

Alex733

Client
Регистрация
27.11.2017
Сообщения
330
Благодарностей
243
Баллы
43
Попробуйте скопировать таблицу в "память" - в таблицу непривязанную к файлу и в ней искать.
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 248
Благодарностей
674
Баллы
113
Всем привет.

Подскажите пожалуйста кто знает, можно ли ускорить выполнение кода?

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

Сейчас скрипт по каждой фразе отрабатывает секунд за 5-10. Но фраз в задаче может быть 1000, что сильно увеличивает время выполнения.

C#:
// берем регулярное выражение для парсинга из переменной
var parserRegexPattern = project.Variables["task_phrase_word_1"].Value;
var parserRegex = new System.Text.RegularExpressions.Regex(parserRegexPattern);
// получаем таблицу, в которой будем искать
var sourceTable = project.Tables["база"];
// получаем таблицу, в которую будем класть
var destTable = project.Tables["база"];
// ищем в каждой строчке в таблице

for(int i = 0; i < sourceTable.RowCount; i++)
{
    // читаем строку из таблицы (это будет массив ячеек)
    var cells = sourceTable.GetRow(i).ToArray();     

    // Проверяем длину массива cells
    if (cells.Length > 6 && cells[6] != null)
    {
        // Игнор регистра -- приводим значение нужной ячейки к нижнему регистру
        cells[6] = cells[6].ToLower();

        // Проверяем ячейку регулярным выражением, если есть совпадение кладем результат во вторую таблицу
        if (parserRegex.IsMatch(cells[6]))
            destTable.AddRow(cells);
    }
}
С регуляркой надо чето делать, она прям сильно нагружает процесс
 
  • Спасибо
Реакции: Devostator

n0n3mi1y

Client
Регистрация
08.03.2017
Сообщения
1 235
Благодарностей
573
Баллы
113
Если реугярок несколько, то можно попробовать положить их все в список.
А потом попробовать поколдовать как-то со строкой
C#:
if (parserRegex.IsMatch(cells[6]))
            destTable.AddRow(cells);
и заменить ее на .Any(x=> ...);
 
  • Спасибо
Реакции: Devostator

n0n3mi1y

Client
Регистрация
08.03.2017
Сообщения
1 235
Благодарностей
573
Баллы
113
Если отправите исходные данные для работы - могу попробовать собрать код целиком
 
  • Спасибо
Реакции: Devostator

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 248
Благодарностей
674
Баллы
113
В регулярке что написано вообще?
 

Devostator

Client
Регистрация
17.09.2011
Сообщения
262
Благодарностей
25
Баллы
28
Попробуйте скопировать таблицу в "память" - в таблицу непривязанную к файлу и в ней искать.
Спасибо за ответ.

Таблица не привязана к файлу, она виртуальная чисто в ЗП.


В регулярке что написано вообще?
Если отправите исходные данные для работы - могу попробовать собрать код целиком
Спасибо за ответ.

Данный сниппет находится в цикле экшенов. Прямо перед данным снипетом идёт экшен, который берет строку из списка и вставляет её в переменную task_phrase_word_1. (На самом деле логика сложнее, берется фраза из списка, разделяется на слова, делаются различные преобразования с фразой, затем они пишется в переменную task_phrase_word_1)

Я пытаюсь разбираться в C# через форум и chatgpt, поэтому не нашёл как сделать не так как у меня сейчас:

1. Берем значение из списка
2. Записываем в переменную
3. Запускаем C# сниппет который использует переменную в качестве значения для regexp
4. Ищем совпадения в ячейке столбца G
5. Если находим - записываем в таблицу-результат
6. Если не находим - берем новое значение из списка и снова к пункту 1.



В списке такие строки:

запчаст
авто
автозапчаст
автодетал
машин
водител
оригинал
кузов
двигател
универсал
премиум
вин
vin
ходов

И в таком духе. Там могут быть любые слова на англ/ру/цифры.

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

Devostator

Client
Регистрация
17.09.2011
Сообщения
262
Благодарностей
25
Баллы
28
-
 

Devostator

Client
Регистрация
17.09.2011
Сообщения
262
Благодарностей
25
Баллы
28
Если реугярок несколько, то можно попробовать положить их все в список.
А потом попробовать поколдовать как-то со строкой
C#:
if (parserRegex.IsMatch(cells[6]))
            destTable.AddRow(cells);
и заменить ее на .Any(x=> ...);
Задумку понял, любопытно, а можете подсказать пример как это написать? Можно с выдуманными данными
 

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 022
Благодарностей
1 424
Баллы
113
C#:
var sourceTable = project.Tables["table_1"]; //исходная таблица
var destinationTable = project.Tables["table_2"]; //целевая таблица
var list = project.Lists["list_1"].Select(x=>x.ToLower()); //список со словами для поиска(сразу приведем их в нижний регистр)
var columnIndex = 6; //номер колонки

sourceTable.GetItems("all", false)//считывание строк таблицы
    .Where(row => //в которых
        row.Count() > columnIndex // существует ячейка
        && list.Any(row.ToArray()[columnIndex].ToLower().Contains) // и в ней содержится любое слово из списка(также, для поиска переведем текст ячейки в нижний регистр)
    )
    .ToList() //приведем к типу
    .ForEach(x=> destinationTable.AddRow(x));//запишем в новую таблицу
 
Последнее редактирование:
  • Спасибо
Реакции: Devostator

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)