Поиск номера строки в таблице по переменной

arthyrgrex

Client
Регистрация
12.05.2013
Сообщения
104
Благодарностей
31
Баллы
28
Ребят - вот код, который по значению в переменной ищет совпадение в таблице и определяет номер строки, если совпадение найдено.

Код:
// берем из переменной текст, который надо искать
var textContains = project.Variables["artikyl_rapid"].Value;
// получаем таблицу, в которой будем искать
var sourceTable = project.Tables["Артикул Цена Наличие"];
// ищем в каждой строчке в таблице
lock(SyncObjects.TableSyncer)
{
    for(int i=0; i < sourceTable.RowCount; i++)
    {
        // читаем строку из таблицы (это будет массив ячеек)
        var cells = sourceTable.GetRow(i).ToArray();
        // пройдем в цикле по всем ячейкам
        for (int j=0; j < cells.Length; j++)
        {
            // проверяем содержание текста в ячейке, если есть совпадение возвращаем
            // номер ячейки
            if (cells[j].Contains(textContains))
            {
            project.Variables["RowNumber"].Value = Convert.ToString(i);
                return j;
            }
        }
    }
}
// если ничего не нашли возвращаем "no"
return "no";
Код отлично работает, но почему-то только 1 раз =)

Т.е. берется артикул из списка - находится в таблице, определяется номер строки.
Затем берется следующий артикул, который тоже присутствует в таблице.
Но проблема в том, что данный код возвращает уже нуль "0" в переменную RowNumber.
Почему он не определяет номер строки?

Заранее благодарен за любые подсказки!
 

arthyrgrex

Client
Регистрация
12.05.2013
Сообщения
104
Благодарностей
31
Баллы
28
ребят, никто не подскажет?)
 

nole

Client
Регистрация
19.11.2010
Сообщения
368
Благодарностей
217
Баллы
43
Может возвращает 0 потому что значение найдено в первой строке?
 

arthyrgrex

Client
Регистрация
12.05.2013
Сообщения
104
Благодарностей
31
Баллы
28
Хз, если честно.
Таблицу проверяю - все впорядке.

По фильтру ищу артикул - есть, номер строки 21514
А через C# сниппет отдает нуль.
 

arthyrgrex

Client
Регистрация
12.05.2013
Сообщения
104
Благодарностей
31
Баллы
28
мля... так и знал ))), еще в прошлый раз, но руки не дошли проверить =))

Вообщем данный сниппет отдавал нуль потому, что таблица лочилась перед циклом.
Убираем лок таблицы и все отлично работает:
Код:
// берем из переменной текст, который надо искать
var textContains = project.Variables["artikyl_rapid"].Value;
// получаем таблицу, в которой будем искать
var sourceTable = project.Tables["Артикул Цена Наличие"];
// ищем в каждой строчке в таблице
    for(int i=0; i < sourceTable.RowCount; i++)
    {
        // читаем строку из таблицы (это будет массив ячеек)
        var cells = sourceTable.GetRow(i).ToArray();
        // пройдем в цикле по всем ячейкам
        for (int j=0; j < cells.Length; j++)
        {
            // проверяем содержание текста в ячейке, если есть совпадение возвращаем
            // номер ячейки
            if (cells[j].Contains(textContains))
            {
            project.Variables["RowNumber"].Value = Convert.ToString(i);
                return j;
            }
        }
    }
// если ничего не нашли возвращаем "no"
return "no";
 

arthyrgrex

Client
Регистрация
12.05.2013
Сообщения
104
Благодарностей
31
Баллы
28
Хотя ребят поторопился с выводами - это какой-то баг экшена..
2 раза он работает нормально, потом нужно ставить галочку "Не возвращать значение" и он только тогда будет нормально отрабатывать..

версия 5.9.9.1
 

nole

Client
Регистрация
19.11.2010
Сообщения
368
Благодарностей
217
Баллы
43
Для начала добавь вот это перед последней строкой кода: project.Variables["RowNumber"].Value = "no";
Это чтобы точно видеть по этой переменной когда ничего не найдено, раз уж ты на нее ориентируешься
У тебя сейчас, если ничего не найдено в таблице значение RowNumber останется от предыдущего поиска

Если текст будет найден в первой строке таблицы, то в RowNumber вернет 0
 
  • Спасибо
Реакции: MarDeVal и arthyrgrex

arthyrgrex

Client
Регистрация
12.05.2013
Сообщения
104
Благодарностей
31
Баллы
28
Для начала добавь вот это перед последней строкой кода: project.Variables["RowNumber"].Value = "no";
Это чтобы точно видеть по этой переменной когда ничего не найдено, раз уж ты на нее ориентируешься
У тебя сейчас, если ничего не найдено в таблице значение RowNumber останется от предыдущего поиска

Если текст будет найден в первой строке таблицы, то в RowNumber вернет 0
nole - ты как всегда красавчик )

Рабочий вариант:
Код:
// берем из переменной текст, который надо искать
var textContains = project.Variables["artikyl_rapid"].Value;
// получаем таблицу, в которой будем искать
var sourceTable = project.Tables["Артикул Цена Наличие"];
// ищем в каждой строчке в таблице
    for(int i=0; i < sourceTable.RowCount; i++)
    {
        // читаем строку из таблицы (это будет массив ячеек)
        var cells = sourceTable.GetRow(i).ToArray();
        // пройдем в цикле по всем ячейкам
        for (int j=0; j < cells.Length; j++)
        {
            // проверяем содержание текста в ячейке, если есть совпадение возвращаем
            // номер ячейки
            if (cells[j].Contains(textContains))
            {
            project.Variables["RowNumber"].Value = Convert.ToString(i);
                return j;
            }
        }
    }
// если ничего не нашли возвращаем "no"
    project.Variables["RowNumber"].Value = "no";
return "no";
 

alya_6

Client
Регистрация
27.08.2018
Сообщения
172
Благодарностей
19
Баллы
18
nole - ты как всегда красавчик )

Рабочий вариант:
Код:
// берем из переменной текст, который надо искать
var textContains = project.Variables["artikyl_rapid"].Value;
// получаем таблицу, в которой будем искать
var sourceTable = project.Tables["Артикул Цена Наличие"];
// ищем в каждой строчке в таблице
    for(int i=0; i < sourceTable.RowCount; i++)
    {
        // читаем строку из таблицы (это будет массив ячеек)
        var cells = sourceTable.GetRow(i).ToArray();
        // пройдем в цикле по всем ячейкам
        for (int j=0; j < cells.Length; j++)
        {
            // проверяем содержание текста в ячейке, если есть совпадение возвращаем
            // номер ячейки
            if (cells[j].Contains(textContains))
            {
            project.Variables["RowNumber"].Value = Convert.ToString(i);
                return j;
            }
        }
    }
// если ничего не нашли возвращаем "no"
    project.Variables["RowNumber"].Value = "no";
return "no";
Спасибо большое! Крутой код)
 

sipoku

Client
Регистрация
04.04.2010
Сообщения
266
Благодарностей
138
Баллы
43
Ребят, а что я делаю неправильно, если у меня он выдает не номер строки, а номер столбца? Вот работает все прекрасно, но выдает номер столбца.
 

alya_6

Client
Регистрация
27.08.2018
Сообщения
172
Благодарностей
19
Баллы
18
Ребят, а что я делаю неправильно, если у меня он выдает не номер строки, а номер столбца? Вот работает все прекрасно, но выдает номер столбца.
Привет. Вероятней всего, i и j перепутал. Но нужно, чтобы ты скинул, как ты сделал. Иначе не сможем помочь.
 

sipoku

Client
Регистрация
04.04.2010
Сообщения
266
Благодарностей
138
Баллы
43
Взял этот код и просто поменял на свои имя переменной и таблицы, больше ничего не меняя
Код:
// берем из переменной текст, который надо искать
var textContains = project.Variables["artikyl_rapid"].Value;
// получаем таблицу, в которой будем искать
var sourceTable = project.Tables["Артикул Цена Наличие"];
// ищем в каждой строчке в таблице
    for(int i=0; i < sourceTable.RowCount; i++)
    {
        // читаем строку из таблицы (это будет массив ячеек)
        var cells = sourceTable.GetRow(i).ToArray();
        // пройдем в цикле по всем ячейкам
        for (int j=0; j < cells.Length; j++)
        {
            // проверяем содержание текста в ячейке, если есть совпадение возвращаем
            // номер ячейки
            if (cells[j].Contains(textContains))
            {
            project.Variables["RowNumber"].Value = Convert.ToString(i);
                return j;
            }
        }
    }
// если ничего не нашли возвращаем "no"
    project.Variables["RowNumber"].Value = "no";
return "no";
Спасибо за помощь. Взял код из другой ветки, мне номер строки в принципе не нужен, мне нужно просто ДА или НЕТ, есть ли текст в таблице.
 

nole

Client
Регистрация
19.11.2010
Сообщения
368
Благодарностей
217
Баллы
43
Взял этот код и просто поменял на свои имя переменной и таблицы, больше ничего не меняя


Спасибо за помощь. Взял код из другой ветки, мне номер строки в принципе не нужен, мне нужно просто ДА или НЕТ, есть ли текст в таблице.
Тебя не поймешь, этот код или из другой ветки код? что ты в нем изменил мы должны представить по твоим словам? и вообще нужна ли еще помощь или уже нет?
 

sipoku

Client
Регистрация
04.04.2010
Сообщения
266
Благодарностей
138
Баллы
43
Тебя не поймешь, этот код или из другой ветки код? что ты в нем изменил мы должны представить по твоим словам? и вообще нужна ли еще помощь или уже нет?
Спасибо. Помощь не нужна уже. Я брал указанный выше код, заменил в нем только имя переменной и имя таблицы. Результат я описал.
Решить проблему нужно было быстро, поэтому пошел на поиски другого решения. И нашел.
 

MarcoPolo

Client
Регистрация
06.10.2012
Сообщения
143
Благодарностей
13
Баллы
18
nole - ты как всегда красавчик )

Рабочий вариант:
Код:
// берем из переменной текст, который надо искать
var textContains = project.Variables["artikyl_rapid"].Value;
// получаем таблицу, в которой будем искать
var sourceTable = project.Tables["Артикул Цена Наличие"];
// ищем в каждой строчке в таблице
    for(int i=0; i < sourceTable.RowCount; i++)
    {
        // читаем строку из таблицы (это будет массив ячеек)
        var cells = sourceTable.GetRow(i).ToArray();
        // пройдем в цикле по всем ячейкам
        for (int j=0; j < cells.Length; j++)
        {
            // проверяем содержание текста в ячейке, если есть совпадение возвращаем
            // номер ячейки
            if (cells[j].Contains(textContains))
            {
            project.Variables["RowNumber"].Value = Convert.ToString(i);
                return j;
            }
        }
    }
// если ничего не нашли возвращаем "no"
    project.Variables["RowNumber"].Value = "no";
return "no";
Подскажите.
Переменную RowNumber нужно после выполнения снипета в список выводить экшеном?
Воспользовался, поменял на свои переменные, выводит 0, хотя значения там есть несколько.
Может кто подскажет, что тут нужно изменить или еще какой код, чтоб в таблице найти все номера строк, в которых есть необходимое значение (присутствует нужный текст).
 

MarcoPolo

Client
Регистрация
06.10.2012
Сообщения
143
Благодарностей
13
Баллы
18
Ап. Прошу помочь. Поднимаю тему.
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 419
Благодарностей
5 454
Баллы
113
Может кто подскажет, что тут нужно изменить или еще какой код, чтоб в таблице найти все номера строк, в которых есть необходимое значение (присутствует нужный текст).
Код не подскажу, а на кубах подскажу.

Давайте подумаем)

1) Можно добавить в таблицу колонку с номерами строк. (в цикле построчно думаю сможете, если нет объясню) Хотя лично мне кажется удобнее оперировать со списком, таблицы слишком капризные.
2) Потом, взять строки > содержит текст (или соответствует регулярному выражению)
3) Далее с каждой строки парсим номер страницы, либо объединяем элементы списка и парсим все значения в другой список. (Что бы легче было составлять регулярку, можно перед и после номера вписать символы, например: -1-)
 
  • Спасибо
Реакции: MarcoPolo

MarcoPolo

Client
Регистрация
06.10.2012
Сообщения
143
Благодарностей
13
Баллы
18
Код не подскажу, а на кубах подскажу.

Давайте подумаем)

1) Можно добавить в таблицу колонку с номерами строк. (в цикле построчно думаю сможете, если нет объясню) Хотя лично мне кажется удобнее оперировать со списком, таблицы слишком капризные.
2) Потом, взять строки > содержит текст (или соответствует регулярному выражению)
3) Далее с каждой строки парсим номер страницы, либо объединяем элементы списка и парсим все значения в другой список. (Что бы легче было составлять регулярку, можно перед и после номера вписать символы, например: -1-)
Большое спасибо, логика понятна, сделать смогу, не проблема. Но до последнего наделся на элегантное решение в одном кубике :-)
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 419
Благодарностей
5 454
Баллы
113

romqori

Client
Регистрация
30.01.2020
Сообщения
12
Благодарностей
1
Баллы
3
Перелопатил весь форум, не нашел, у меня ошибка
Выполнение действия CSharp OwnCode. No such variable: RowNumber
подскажите?
 

romqori

Client
Регистрация
30.01.2020
Сообщения
12
Благодарностей
1
Баллы
3

ukrainec2014

Client
Регистрация
12.05.2017
Сообщения
351
Благодарностей
52
Баллы
28
а с гугл таблицами работать должно же?
 

alya_6

Client
Регистрация
27.08.2018
Сообщения
172
Благодарностей
19
Баллы
18

finista

Client
Регистрация
10.10.2012
Сообщения
365
Благодарностей
57
Баллы
28

ukrainec2014

Client
Регистрация
12.05.2017
Сообщения
351
Благодарностей
52
Баллы
28

ukrainec2014

Client
Регистрация
12.05.2017
Сообщения
351
Благодарностей
52
Баллы
28
  • Спасибо
Реакции: Zmaster и finista

finista

Client
Регистрация
10.10.2012
Сообщения
365
Благодарностей
57
Баллы
28
я пока костыль использую.. дополнительная нумерация строк, типа так
Посмотреть вложение 59844
Тоже так сделал. В Google таблицах пришлось через цикл. Беру кол-во строк и после каждого шага минусую одну.

Минус этого метода самый главный, Google Sheets не умеют быстро работать, приходится паузу в миллисекундах ставить.
 
  • Спасибо
Реакции: ukrainec2014

MarDeVal

Client
Регистрация
12.12.2019
Сообщения
20
Благодарностей
4
Баллы
3

dr.reklam

Client
Регистрация
02.06.2020
Сообщения
64
Благодарностей
15
Баллы
8
Ребят, а что я делаю неправильно, если у меня он выдает не номер строки, а номер столбца? Вот работает все прекрасно, но выдает номер столбца
Если возвращает 0, то это номер столбца. Поменяйте return j; на return i; или скопируйте исправленный код
C#:
// берем из переменной текст, который надо искать
var textContains = project.Variables["artikyl_rapid"].Value;
// получаем таблицу, в которой будем искать
var sourceTable = project.Tables["Артикул Цена Наличие"];
// ищем в каждой строчке в таблице
    for(int i=0; i < sourceTable.RowCount; i++)
    {
        // читаем строку из таблицы (это будет массив ячеек)
        var cells = sourceTable.GetRow(i).ToArray();
        // пройдем в цикле по всем ячейкам
        for (int j=0; j < cells.Length; j++)
        {
            // проверяем содержание текста в ячейке, если есть совпадение возвращаем
            // номер ячейки
            if (cells[j].Contains(textContains))
            {
            project.Variables["RowNumber"].Value = Convert.ToString(i);
                return i;
            }
        }
    }
// если ничего не нашли возвращаем "no"
    project.Variables["RowNumber"].Value = "no";
return "no";
 
  • Спасибо
Реакции: sipoku
Регистрация
26.05.2020
Сообщения
497
Благодарностей
172
Баллы
43
nole - ты как всегда красавчик )

Рабочий вариант:
Код:
// берем из переменной текст, который надо искать
var textContains = project.Variables["artikyl_rapid"].Value;
// получаем таблицу, в которой будем искать
var sourceTable = project.Tables["Артикул Цена Наличие"];
// ищем в каждой строчке в таблице
    for(int i=0; i < sourceTable.RowCount; i++)
    {
        // читаем строку из таблицы (это будет массив ячеек)
        var cells = sourceTable.GetRow(i).ToArray();
        // пройдем в цикле по всем ячейкам
        for (int j=0; j < cells.Length; j++)
        {
            // проверяем содержание текста в ячейке, если есть совпадение возвращаем
            // номер ячейки
            if (cells[j].Contains(textContains))
            {
            project.Variables["RowNumber"].Value = Convert.ToString(i);
                return j;
            }
        }
    }
// если ничего не нашли возвращаем "no"
    project.Variables["RowNumber"].Value = "no";
return "no";
А не подскажите, как искать не по всем ячейкам, а по ячейкам определенного столбца? То есть, меня интересует номер строки, в которой текстовая ячейка из столбца B равна содержимому текстовой переменной...
Плюс, вскрылся еще один нюанс - ячеек (строк) с одним значением может быть несколько, поэтому результат в виде списка номеров строк нужно сохранять в список, не в переменную. За решение готов подбросить на пивас/сиги...
 
Последнее редактирование:

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