Регулярные выражения и таблицы

finoz0

Client
Регистрация
20.01.2021
Сообщения
105
Благодарностей
17
Баллы
18
Беру строку из таблицы, при этом обязательно, чтобы эта строка содержала "текст1" и точно не содержала "текст2", пока работает так: берем строку, которая содержит "текст1", затем проверяю все 20 ячеек на содержание "текст2" и если он там есть(а это нам не нужно), то заново берем следующую случайную строку. Начал смотреть в сторону регулярок, но пока не сообразил как их можно использовать в данном случае и можно ли вообще. Может кто подскажет где копать?
 

finoz0

Client
Регистрация
20.01.2021
Сообщения
105
Благодарностей
17
Баллы
18

Bablozavr

Client
Регистрация
26.01.2018
Сообщения
310
Благодарностей
163
Баллы
43
На скорую руку, просто проверь, запусти в кубике c#, по играй со значениями:
C#:
string s1 = "The quick brown fox jumps over the lazy dog"; // Исходная строка
string s2 = "fox"; // Строка, которая должна входить
string s3 = "1"; // Строка, котороя не должна входить

bool b = s1.Contains(s2);
bool c = s1.Contains(s3);

if (b && !c) {
    return "Условие выполнено, сохраняем результат";
} else {
    return "Условие не выполнено, пропускаем";
}
Строку из таблицы записываешь в переменную, кубиком, текст1 и текст2 в отдельные переменные, после этого выполняешь этот c# код, подставив свои названия переменных, на выходе получаешь результат. Это все зацикливаешь так же кубиками, пока не закончатся строки в таблице.
C#:
string s1 = project.Variables["название переменной, строка из таблицы"].Value; // Строка из таблицы
string s2 = project.Variables["название переменной, текст1"].Value; // Строка, которая должна входить
string s3 = project.Variables["название переменной, текст2"].Value; // Строка, котороя не должна входить

bool b = s1.Contains(s2);
bool c = s1.Contains(s3);

if (b && !c) {
    project.Variables["название переменной, в которую сохранить результат"].Value = project.Variables["название переменной, строка из таблицы"].Value;
} else {
    return "Условие не выполнено, пропускаем";
}
 
Последнее редактирование:

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 443
Благодарностей
8 673
Баллы
113
Мне бы с кубиками сначала разобраться, а потом уже в C#
Если на кубиках стандартных, то вот два варианта, почти равноценных.
Приложил шаблон также. В первом кубике (точка старта) задается регулярное выражение для поиска, для каждого из вариантов оно чуть-чуть разное.

71668
 

Вложения

  • Спасибо
Реакции: Маломальский

finoz0

Client
Регистрация
20.01.2021
Сообщения
105
Благодарностей
17
Баллы
18
На скорую руку, просто проверь, запусти в кубике c#, по играй со значениями:
C#:
string s1 = "The quick brown fox jumps over the lazy dog"; // Исходная строка
string s2 = "fox"; // Строка, которая должна входить
string s3 = "1"; // Строка, котороя не должна входить

bool b = s1.Contains(s2);
bool c = s1.Contains(s3);

if (b && !c) {
    return "Условие выполнено, сохраняем результат";
} else {
    return "Условие не выполнено, пропускаем";
}
Строку из таблицы записываешь в переменную, кубиком, текст1 и текст2 в отдельные переменные, после этого выполняешь этот c# код, подставив свои названия переменных, на выходе получаешь результат. Это все зацикливаешь так же кубиками, пока не закончатся строки в таблице.
C#:
string s1 = project.Variables["название переменной, строка из таблицы"].Value; // Строка из таблицы
string s2 = project.Variables["название переменной, текст1"].Value; // Строка, которая должна входить
string s3 = project.Variables["название переменной, текст2"].Value; // Строка, котороя не должна входить

bool b = s1.Contains(s2);
bool c = s1.Contains(s3);

if (b && !c) {
    project.Variables["название переменной, в которую сохранить результат"].Value = project.Variables["название переменной, строка из таблицы"].Value;
} else {
    return "Условие не выполнено, пропускаем";
}
Всю душу вложил в понимание, но так и не удалось запустить удачно
Прикрепил как примерно выглядит моя таблица(только гораздо больше как вниз так и вбок)
213.png

А получить пытаюсь номер строки, которая содержит "bbbb" и не содержит "eeee". Чтобы потом значения каждого из столбцов данной строки, я мог добавить в переменные, которых порядка 10
По вашему коду не понял как добавить ["название переменной, строка из таблицы"], так как всю строку в переменную добавить нельзя насколько я знаю. Такая же проблема и с ["название переменной, в которую сохранить результат"], так как значений в таблице много, не совсем понял, что это должна быть за переменная.
Очень извиняюсь, если туплю, но очень хочу разобраться
 

finoz0

Client
Регистрация
20.01.2021
Сообщения
105
Благодарностей
17
Баллы
18
Если на кубиках стандартных, то вот два варианта, почти равноценных.
Приложил шаблон также. В первом кубике (точка старта) задается регулярное выражение, для каждого из вариантов оно чуть-чуть разное.

Примерно так у меня в данный момент это и работает, но возможно ваш вариант будет работать быстрее. У меня большой объём данных в таблице и идёт долгий поиск
 
  • Спасибо
Реакции: Sergodjan

Bablozavr

Client
Регистрация
26.01.2018
Сообщения
310
Благодарностей
163
Баллы
43
1) Создаем новый список, который будет хранить номера строк, соответствующих условию задачи (в коде это "Список 1");
2) Заменяем названия переменных, которые содержат слово для посика и стоп слово, а так же название таблицы на свои;
3) Запускаем кубик.

Результатом будут id строк, которые соответствуют условию, все это будет находится в списке, который создали.
Дальше уже получаем номер строки таблицы из списка, и работаем конкретно с этой строкой используя кубики, например.

C#:
var table = project.Tables["Таблица 1"]; // Таблица с данными для обработки
var sourceList = project.Lists["Список 1"]; // Список для найденных номеров строк

// Переменная, содержащее слово, которое обязательно должно присутствовать в строке
string good_word = project.Variables["good_word"].Value;

// Переменная, содержащее слово, которое не должно присутствовать в строке
string bad_word = project.Variables["bad_word"].Value;

// Строка
string row;

// good_word и bad_word
bool gw,bw;

//sourceList.Clear(); // очистили список, перед выполнением, для теста

// Проходим по всей таблице и ищем номера строк, которые соответствуют условию задачи
for (int i = 0; i < table.RowCount; i++) {
    row = string.Join(" ", table.GetRow(i));
   
    gw = row.Contains(good_word);
    bw = row.Contains(bad_word);
   
    if (gw && !bw) {
        sourceList.Add(i.ToString());
    }
}
На сколько быстро будет работать данный вариант, не знаю, но надеюсь это поможет.
 
Последнее редактирование:

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 542
Баллы
113
А получить пытаюсь номер строки, которая содержит "bbbb" и не содержит "eeee". Чтобы потом значения каждого из столбцов данной строки, я мог добавить в переменные, которых порядка 10
Решается одним экшеном с регуляркой "негативного просмотра" (?<!eeee.*)bbbb(?!.*eeee)

На примере таблицы:
71674


Если нам нужно взять строку, которая содержит bbbb, но не содержит eeee, то нам подойдет только строка под номером 1.

71679


Повторная попытка завершится ошибкой, т.к. подходящих под условие строк больше нет.

71680
 

Вложения

Bablozavr

Client
Регистрация
26.01.2018
Сообщения
310
Благодарностей
163
Баллы
43

finoz0

Client
Регистрация
20.01.2021
Сообщения
105
Благодарностей
17
Баллы
18
Решается одним экшеном с регуляркой "негативного просмотра" (?<!eeee.*)bbbb(?!.*eeee)

На примере таблицы:
Посмотреть вложение 71674

Если нам нужно взять строку, которая содержит bbbb, но не содержит eeee, то нам подойдет только строка под номером 1.

Посмотреть вложение 71679

Повторная попытка завершится ошибкой, т.к. подходящих под условие строк больше нет.

Посмотреть вложение 71680
Спасибо большое, сильно упростили мне жизнь. Можно ещё напоследок спросить, чтобы до конца разобраться в работе регулярок, есть ли возможность добавить сюда ещё одно значение в "обязательное содержимое", например, чтобы одновременно искало строку содержащую bbbb и сссс, но не содержащую eeee
 

finoz0

Client
Регистрация
20.01.2021
Сообщения
105
Благодарностей
17
Баллы
18
1) Создаем новый список, который будет хранить номера строк, соответствующих условию задачи (в коде это "Список 1");
2) Заменяем названия переменных, которые содержат слово для посика и стоп слово, а так же название таблицы на свои;
3) Запускаем кубик.

Результатом будут id строк, которые соответствуют условию, все это будет находится в списке, который создали.
Дальше уже получаем номер строки таблицы из списка, и работаем конкретно с этой строкой используя кубики, например.

C#:
var table = project.Tables["Таблица 1"]; // Таблица с данными для обработки
var sourceList = project.Lists["Список 1"]; // Список для найденных номеров строк

// Переменная, содержащее слово, которое обязательно должно присутствовать в строке
string good_word = project.Variables["good_word"].Value;

// Переменная, содержащее слово, которое не должно присутствовать в строке
string bad_word = project.Variables["bad_word"].Value;

// Строка
string row;

// good_word и bad_word
bool gw,bw;

//sourceList.Clear(); // очистили список, перед выполнением, для теста

// Проходим по всей таблице и ищем номера строк, которые соответствуют условию задачи
for (int i = 0; i < table.RowCount; i++) {
    row = string.Join(" ", table.GetRow(i));
  
    gw = row.Contains(good_word);
    bw = row.Contains(bad_word);
  
    if (gw && !bw) {
        sourceList.Add(i.ToString());
    }
}
На сколько быстро будет работать данный вариант, не знаю, но надеюсь это поможет.
Спасибо, немного изменил ваш код и использовал в другом проекте, всё отлично. Хотя бы немного начал понимать С#
 

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