Поиск в таблице ячейки и запись в строку этой ячейки.

ferr9918

Client
Регистрация
20.01.2014
Сообщения
199
Благодарностей
97
Баллы
28
Вообщем решаю такую задачу

Есть таблица в которой присутствуют столбцы (ip|mail|pass|login|activ|) количество строк окола 450-500. В процессе выполнения шаблона мне необходимо произвести проверку наличия в столбце mail определенного адреса и если находится строка с такой почтой то необходимо в этой строчке в столбце activ поставить +

На данный момент я решаю эту проблему таким образом:
Беру каждую ячейку начиная с первой в столбце mail и сравниваю с тем адресом который я ищу если условие выполняется то вписываю в столбец activ + если не нахожу то делаю соответствующее сообщение. Все бы ничего но время тратится на перебор каждой строки не мало поэтому вот и решил может кто предложит более рациональное решение.
 

KirillOFF

Client
Регистрация
18.12.2010
Сообщения
1 127
Благодарностей
517
Баллы
113
Цикл в любом случае нужен, но возможно его реализация на C# будет быстрее, чем на кубиках.
 

ferr9918

Client
Регистрация
20.01.2014
Сообщения
199
Благодарностей
97
Баллы
28
Да я вот и подумал о C# мож кто подскажет.
 

dannko

Client
Регистрация
12.08.2013
Сообщения
137
Благодарностей
32
Баллы
28
У меня завалялся такой сниппет, но это, по-моему, поиск по списку
Код:
// берем из переменной текст, который надо искать
var textContains = project.Variables["text"].Value;
// получаем таблицу, в которой будем искать
var sourceTable = project.Tables["screenshots"];
// ищем в каждой строчке в таблице
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++)
{
// проверяем содержание текста в ячейке, если есть совпадение возвращаем "yes"
if (cells[j].Contains(textContains))
return i;
}
}
}
// если ничего не нашли возвращаем "no"
return "54321";
 
  • Спасибо
Реакции: nussus

ferr9918

Client
Регистрация
20.01.2014
Сообщения
199
Благодарностей
97
Баллы
28
Ага разобрался и помог еще наш одноклубник
Radzhab
 

eldar

Client
Регистрация
01.07.2011
Сообщения
227
Благодарностей
14
Баллы
18
Ага разобрался и помог еще наш одноклубник
Radzhab
хорошо, а файл на с# для поиска по таблице уже можете выложить, он у вас ищет только по столбцу mail или по всем столбцам?
в результате вам дает номер строки?
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113

eldar

Client
Регистрация
01.07.2011
Сообщения
227
Благодарностей
14
Баллы
18

Semyon

Client
Регистрация
19.09.2016
Сообщения
43
Благодарностей
36
Баллы
18

lutidza

Client
Регистрация
26.05.2011
Сообщения
65
Благодарностей
15
Баллы
8
Добрый день! А как заставить этот код искать по точному совпадению сего содержания ячейки?
Сейчас, если есть две ячейки: цвет корпуса, цвет. По поиском по значению цвет, он находит цвет корпуса, так как он стоит первым.
 

S16er1um

Client
Регистрация
14.04.2016
Сообщения
826
Благодарностей
240
Баллы
43
Каким образом вы проверку осуществляете? у меня вот нормально всё проверило. upload_2017-4-7_13-5-5.png
Как видите результат - false.
Подозреваю, что вы ищите через регулярку. Тогда логично, что "Цвет" является частью фразы "Цвет корпуса"

Вот так сделайте
upload_2017-4-7_13-6-26.png
и будет всё правильно работать
 

lutidza

Client
Регистрация
26.05.2011
Сообщения
65
Благодарностей
15
Баллы
8
Возможно, кому-то пригодится, следующий сниппет ищет строку в которой находится ячейка полностью совпадающая с искомой строкой.

Код:
// берем из переменной текст, который надо искать
var textContains = project.Variables["prod_mpn"].Value;
// получаем таблицу, в которой будем искать
var sourceTable = project.Tables["stock_start_base"];
// ищем в каждой строчке в таблице
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++)
            {
                // проверяем содержание текста в ячейке, если есть совпадение возвращаем "yes"
                if (cells[j].Contains(textContains)){
                   
                     // После того как найдено первое совпадение, получаем значение ячейки в переменную findText
                     var findText = cells[j];
                   
                     //Сравниваем значение найденой ячейки с искомым текстом, если равно, возвращаем номер строки, если нет идём дальше
                     if(findText==textContains){
                        return i;
                     }
                     
                     else {
                        j++;
                    }
                   
                }
            }
        }
    // если ничего не нашли возвращаем "no"
    return "no";
}
 

ParfeniyAnton

Client
Регистрация
24.08.2014
Сообщения
302
Благодарностей
50
Баллы
28
Привет! Помогите, плиз!

Есть 2 таблицы.
В таблице source 2 столбца
В первом столбце название изделия, во втором его цена

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

Задача: Берём значение A-0 из Source(допустим это iphonex), и проверяем в цикле есть ли это значение (iphonex) в столце A таблицы final.
В случае если значение найдено, то берём A-1 из Source (цена товара) и переменную g, в которой записан номер нужного столбца (это отдельный сниппет) и пишем в получившуюся ячейку цену товара.

Если значение A-0 из Source не найдено в столбце A таблицы final, то нужно значение A-0 записать в A столбец таблицы final после всех, уже записанных в столбце строк, и после этого как в первом варианте взять A-1 из Source и записать его в строку, в которой у нас теперь A-0 и в столбец, номер которого лежит в g

Я что-то сделал, но оно совсем не работает и зацикливается в адовый бесконечный цикл.
Всем благ!



Код:
var source = project.Tables["temp"];
var final = project.Tables["result"];
string g = project.Variables["market"].Value; // номер столбца магазина из таблицы source в таблице final приходит из вне

for(int i=0; i < source.RowCount; i++)
{
        string p1 = source.GetCell("A",i);
        string p2 = source.GetCell("B",i);
        string cell = final.GetCell("A", i);
        final.SetCell(g, i , p2);
    for(int t=0; t < sourceTable.RowCount; t++)
    {
        // читаем строку из таблицы (это будет массив ячеек)
        string cells = sourceTable.GetRow(t).ToArray();
        // проверяем вторую ячейку регулярным выражением, если есть совпадение кладем результат во вторую таблицу
        if (cells[t].Contains(p1)){
            final.SetCell(g, t, p1);
        }
    }
       
}
Для наглядности попытался визуально показать эти 2 таблицы.
1. Source в которой лежат товары и цены



2. final в которой будут записаны цены на товары в разных магазинах
 

echoragaq

Client
Регистрация
14.08.2018
Сообщения
11
Благодарностей
0
Баллы
1
Ребят, очень нужна помощь

Есть таблица http://prntscr.com/kxza0h
мне нужно найти номера всех строк с user1, как это сделать?
 

smartwisard

Client
Регистрация
17.01.2017
Сообщения
824
Благодарностей
83
Баллы
28
В таблице могу получить строку, содержащую почту. Не знаю, как получить номер строки.
Для этого хочу добавить в один из столбцов номера по возрастанию.
Как это сделать не по ячейкам, а сразу?

Сниппет отсюда подойдёт? https://zennolab.com/discussion/threads/poisk-po-tablice.51640/#post-385512
Код:
var tbl = project.Tables["tablica"];
var lst = project.Lists["spisok"];
for(int i=0; i < tbl.RowCount; i++)
{
        string u = tbl.GetCell("B",i); //В колонке "B" 
        if(u.Contains(user1)) lst.Add(i.ToString()); //Если обнаружило user1 кладем номер строки в список

}
 
Последнее редактирование:

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 525
Благодарностей
3 376
Баллы
113
В таблице могу получить строку, содержащую почту. Не знаю, как получить номер строки.
C#:
IZennoTable table = project.Tables["Test"];

for(int i = 0; i < table.RowCount; i++)
{
    if (table.GetCell("A", i).Contains(project.Variables["email"].Value)) 
    {
        return i;
    }
}
throw new Exception("email не найден."); //ошибка, если не найден
 
  • Спасибо
Реакции: Kuki и __Maks

diamlan

Client
Регистрация
14.09.2019
Сообщения
113
Благодарностей
18
Баллы
18
Можно код для работы с списком?
 

ShikoFess

Client
Регистрация
21.12.2017
Сообщения
149
Благодарностей
117
Баллы
43
Возможно, кому-то пригодится, следующий сниппет ищет строку в которой находится ячейка полностью совпадающая с искомой строкой.

Код:
// берем из переменной текст, который надо искать
var textContains = project.Variables["prod_mpn"].Value;
// получаем таблицу, в которой будем искать
var sourceTable = project.Tables["stock_start_base"];
// ищем в каждой строчке в таблице
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++)
            {
                // проверяем содержание текста в ячейке, если есть совпадение возвращаем "yes"
                if (cells[j].Contains(textContains)){
                  
                     // После того как найдено первое совпадение, получаем значение ячейки в переменную findText
                     var findText = cells[j];
                  
                     //Сравниваем значение найденой ячейки с искомым текстом, если равно, возвращаем номер строки, если нет идём дальше
                     if(findText==textContains){
                        return i;
                     }
                    
                     else {
                        j++;
                    }
                  
                }
            }
        }
    // если ничего не нашли возвращаем "no"
    return "no";
}
А как сделать чтобы искало не по всем ячейкам , а только по определенному стобцу? Например искало только в первом столбце.
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 375
Благодарностей
2 041
Баллы
113
А как сделать чтобы искало не по всем ячейкам , а только по определенному стобцу? Например искало только в первом столбце.
вроде в коде всё расписано, не сложно там исправить на нужное что тебе надо, лень чтоли ?
 

efipys

Client
Регистрация
29.09.2016
Сообщения
22
Благодарностей
2
Баллы
3
Возможно, кому-то пригодится, следующий сниппет ищет строку в которой находится ячейка полностью совпадающая с искомой строкой.

Код:
// берем из переменной текст, который надо искать
var textContains = project.Variables["prod_mpn"].Value;
// получаем таблицу, в которой будем искать
var sourceTable = project.Tables["stock_start_base"];
// ищем в каждой строчке в таблице
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++)
            {
                // проверяем содержание текста в ячейке, если есть совпадение возвращаем "yes"
                if (cells[j].Contains(textContains)){
                  
                     // После того как найдено первое совпадение, получаем значение ячейки в переменную findText
                     var findText = cells[j];
                  
                     //Сравниваем значение найденой ячейки с искомым текстом, если равно, возвращаем номер строки, если нет идём дальше
                     if(findText==textContains){
                        return i;
                     }
                    
                     else {
                        j++;
                    }
                  
                }
            }
        }
    // если ничего не нашли возвращаем "no"
    return "no";
}

Братишка спасибо)
 
  • Спасибо
Реакции: __Maks

kolina

Client
Регистрация
05.10.2019
Сообщения
165
Благодарностей
47
Баллы
28
Как можно найти нужную строку по колонке "ID товара", и в ячейке "Примечание" заменить информацию. Заранее спасибо!1212.png
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 578
Благодарностей
9 189
Баллы
113
Как можно найти нужную строку по колонке "ID товара", и в ячейке "Примечание" заменить информацию. Заранее спасибо!Посмотреть вложение 71952
Вот тут есть снипет получения номера строки по содержимому в нужном столбце таблицы.
Соответственно, получаете этот номер строки и далее можете уже обычным действием "Операции над таблицей" записать в таблицу нужное значение, используя этот номер строки и номер столбца, заранее известный вам.
 
  • Спасибо
Реакции: kolina

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