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

  • Автор темы Автор темы arthyrgrex
  • Дата начала Дата начала

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.
Почему он не определяет номер строки?

Заранее благодарен за любые подсказки!
 
ребят, никто не подскажет?)
 
Может возвращает 0 потому что значение найдено в первой строке?
 
Хз, если честно.
Таблицу проверяю - все впорядке.

По фильтру ищу артикул - есть, номер строки 21514
А через 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 j;
            }
        }
    }
// если ничего не нашли возвращаем "no"
return "no";
 
Хотя ребят поторопился с выводами - это какой-то баг экшена..
2 раза он работает нормально, потом нужно ставить галочку "Не возвращать значение" и он только тогда будет нормально отрабатывать..

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

Если текст будет найден в первой строке таблицы, то в RowNumber вернет 0
 
  • Спасибо
Реакции: MarDeVal и arthyrgrex
Для начала добавь вот это перед последней строкой кода: 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";
 
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";
Спасибо большое! Крутой код)
 
Ребят, а что я делаю неправильно, если у меня он выдает не номер строки, а номер столбца? Вот работает все прекрасно, но выдает номер столбца.
 
Ребят, а что я делаю неправильно, если у меня он выдает не номер строки, а номер столбца? Вот работает все прекрасно, но выдает номер столбца.
Привет. Вероятней всего, i и j перепутал. Но нужно, чтобы ты скинул, как ты сделал. Иначе не сможем помочь.
 
Взял этот код и просто поменял на свои имя переменной и таблицы, больше ничего не меняя
Код:
Развернуть Свернуть Копировать
// берем из переменной текст, который надо искать
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 - ты как всегда красавчик )

Рабочий вариант:
Код:
Развернуть Свернуть Копировать
// берем из переменной текст, который надо искать
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, хотя значения там есть несколько.
Может кто подскажет, что тут нужно изменить или еще какой код, чтоб в таблице найти все номера строк, в которых есть необходимое значение (присутствует нужный текст).
 
Ап. Прошу помочь. Поднимаю тему.
 
Может кто подскажет, что тут нужно изменить или еще какой код, чтоб в таблице найти все номера строк, в которых есть необходимое значение (присутствует нужный текст).
Код не подскажу, а на кубах подскажу.

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

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

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

1) Можно добавить в таблицу колонку с номерами строк. (в цикле построчно думаю сможете, если нет объясню) Хотя лично мне кажется удобнее оперировать со списком, таблицы слишком капризные.
2) Потом, взять строки > содержит текст (или соответствует регулярному выражению)
3) Далее с каждой строки парсим номер страницы, либо объединяем элементы списка и парсим все значения в другой список. (Что бы легче было составлять регулярку, можно перед и после номера вписать символы, например: -1-)
Большое спасибо, логика понятна, сделать смогу, не проблема. Но до последнего наделся на элегантное решение в одном кубике :)
 
Перелопатил весь форум, не нашел, у меня ошибка
Выполнение действия CSharp OwnCode. No such variable: RowNumber
подскажите?
 
а с гугл таблицами работать должно же?
 
У меня c гугл не стал работать
я пока костыль использую.. дополнительная нумерация строк, типа так
59844
 
  • Спасибо
Реакции: Zmaster и finista
я пока костыль использую.. дополнительная нумерация строк, типа так
Посмотреть вложение 59844
Тоже так сделал. В Google таблицах пришлось через цикл. Беру кол-во строк и после каждого шага минусую одну.

Минус этого метода самый главный, Google Sheets не умеют быстро работать, приходится паузу в миллисекундах ставить.
 
  • Спасибо
Реакции: ukrainec2014
Ребят, а что я делаю неправильно, если у меня он выдает не номер строки, а номер столбца? Вот работает все прекрасно, но выдает номер столбца
Если возвращает 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
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 равна содержимому текстовой переменной...
Плюс, вскрылся еще один нюанс - ячеек (строк) с одним значением может быть несколько, поэтому результат в виде списка номеров строк нужно сохранять в список, не в переменную. За решение готов подбросить на пивас/сиги...
 
Последнее редактирование:

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