Снипет C# поиск ячейки в таблице по имени

kagorec

Client
Регистрация
24.08.2013
Сообщения
916
Благодарностей
471
Баллы
63
Подскажите пожалуйста решение с работой Таблицы.

Как можно получить содержимое ячейки по координатам в роли которых текст ячеек?

Входные данные:
* Статичный документ который подготовлен заранее, и используется в дальнейшем лишь для поиска совпадений.
* Переменная "input" имеет значение в виде текста "Хочешь"
* Переменная "var2" имеет значение в виде текста "neutral"



Требуется получить значение из ячейки, как на скриншоте "Ну незнаю" :-)
 
  • Спасибо
Реакции: specialist

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
по слову - хочешь нужно найти колонку input и взять значение из колонки neutral?
 
  • Спасибо
Реакции: kagorec

kagorec

Client
Регистрация
24.08.2013
Сообщения
916
Благодарностей
471
Баллы
63
Спасибо, но входные данные в переменных могут меняться.
Таблица статичная, из нее получаем значение...

UPD:
по слову - хочешь нужно найти колонку input и взять значение из колонки neutral?
Да). Найти строку от первой колонки (она с именем "input"), на этой строке взять значение из ячейки у которой колонка с именем "neutral"
 

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
Как можно получить содержимое ячейки по координатам в роли которых текст ячеек?
Я делал так, получаю в виде массива список всех ячеек и прогоняю в цикле, сравнивая с искомым значением. Если совпадает, то координаты из цикла уже знаю.

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

В текущей задаче достаточно знать номер строки.
В цикле читаем таблицу
Находим "хочешь"
Ответ в этой же строке, но в переменной neutral
 
Последнее редактирование:

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
Код:
string hochesh = "Хочешь";
string var2 = string.Empty;
var table = project.Tables["table"];

string[] ta = table.GetRow(0).ToArray();
int input = 777;
int neutral = 777;
for(int i = 0; i < ta.Length; i++)
{
    if(ta[i].Equals("input")) input = i;
    if(ta[i].Equals("neutral")) neutral = i;
}

if(input = 777 || neutral == 777)
{
    project.SendInfoToLog("Кина не будет", true);
    throw new Exception("Кина не будет");
}

for(int i = 0; i < table.RowCount; i++)
{
    if(table.GetCell(input, i).Equals(hochesh))
    {
        var2 = table.GetCell(neutral, i);
        break;
    }   
}
 
  • Спасибо
Реакции: nik-n и kagorec

kagorec

Client
Регистрация
24.08.2013
Сообщения
916
Благодарностей
471
Баллы
63
Как быть c переменными "input" и "var2" имеют значения которые иногда меняются?

Предположительно
Код:
string hochesh = "Хочешь";
тогда можно сменить на
var hochesh = project.Variables["input"].Value;

и

string var2 = string.Empty;
тогда можно сменить на
var var2 = project.Variables["var2"].Value;
Спасибо, но входные данные в переменных могут меняться.
:-)
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63

kagorec

Client
Регистрация
24.08.2013
Сообщения
916
Благодарностей
471
Баллы
63
Документ статичный - НЕ изменяется! Служит как база:-)
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
Код:
string hochesh = project.Variables["input"].Value; //переменная с строкой которую нужно найти

var table = project.Tables["table"];
int colnum1 = 777;
int colnum2 = 777;
string col1 = "input"; //переменная с названием столбца в котором нужно найти строку
string col2 = "neutral"; //переменная с названием столбца в которой нужно взять строку
string[] ta = table.GetRow(0).ToArray(); //берет перевый ряд таблици в массив
//находим номера колонок
for(int i = 0; i < ta.Length; i++)
{
    if(ta[i].Equals(col1)) colnum1 = i; // номер колонки в которой нужно найти строку
    if(ta[i].Equals(col2)) colnum2 = i; // номер колонки в которой нужно взять строку
}
//если хоть в одной колонке дефолтное число, то выход по ошибке
if(colnum1 == 777 || colnum2 == 777)
{
    project.SendInfoToLog("Одна из колонок не найдена", true);
    throw new Exception("Одна из колонок не найдена");
}
//тут записывает результат в переменную проекта var2
for(int i = 0; i < table.RowCount; i++)
{
    if(table.GetCell(colnum1, i).Equals(hochesh))
    {
        project.Variables["var2"].Value = table.GetCell(colnum2, i); //тут результат
        break;
    } 
}
 
  • Спасибо
Реакции: kagorec

inotoxic

Client
Регистрация
20.04.2015
Сообщения
354
Благодарностей
162
Баллы
43
SergSh
Прошу прощения, за может быть дурацкий вопрос.
Поясните, для чего в снипете инициируются переменные "int colnum1" и "int colnum2"
Поиск же в таблице ведется по строковым значениям
 

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
для чего в снипете инициируются переменные "int colnum1" и "int colnum2"
номера столбиков хотели показать, у меня немного другое решение, хотя логика такая же.

Сделал в виде проекта, т.к. у меня не было готового решения до этого для зенки.

Код:
// Читаем таблицу
var table = project.Tables["faq"];

// Варианты ответа
int smile = 1;
int neutral = 2;
int angry = 3;

// Узнаем, какой был вопрос
string input = project.Variables["input"].Value;

// Если вопрос не найден, то будет использоваться данное значение
string answer = "Ответ не найден";

// Количество строк в таблице
int rowCount = table.RowCount;

// Перебираем все строки, если вопрос совпадает, даем ответ
for(int i = 0; i < rowCount; i++)
{ 
    string col1 = table.GetRow(i).ToArray()[0]; // значения в первом столбце каждой строки
 
    // project.SendInfoToLog(col1 + " == " + input, true); // Отладка
 
    // сравнивать строки лучше встроенными методами, сравниваем без учета регистра
    if (string.Equals(col1, input, StringComparison.CurrentCultureIgnoreCase)){
        answer = table.GetRow(i).ToArray()[neutral]; // ответ как индекс столбца, neutral = 2
        return answer; // если ответ найден, возвращаем значение
    }
 
}

return answer; // если не нашли ответ в таблице
 

Вложения

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
SergSh
Прошу прощения, за может быть дурацкий вопрос.
Поясните, для чего в снипете инициируются переменные "int colnum1" и "int colnum2"
Поиск же в таблице ведется по строковым значениям
в коде реализована возможность произвольно подставлять названия колонок с которыми нужно работать, дальше сниппет ищет номера этих колонок и записывает в переменные "int colnum1" и "int colnum2".
 
  • Спасибо
Реакции: inotoxic

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
в коде реализована возможность произвольно подставлять названия колонок
Если таблица подключена с флажком "Первая строка содержит заголовки", то код не сработает.


Код:
project.SendInfoToLog(table.ToString());
 

Вложения

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
  • Спасибо
Реакции: kagorec

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
нужно поставить в курс kagorec
Для него тут целых два решения, ему выбирать, ваше интересное технически, с поиском столбца по наименованию и прерыванием.
У меня прерывания нет, выход сразу по return. Если не знает ответ, пишет что-то общее. Работает простым перебором и явным указанием.
Думаю найдет подходящее )
 
Последнее редактирование:
  • Спасибо
Реакции: kagorec и SergSh

kagorec

Client
Регистрация
24.08.2013
Сообщения
916
Благодарностей
471
Баллы
63
Уважаемые, спасибо за помощь. Но не получилось завести снипеты.
Прикладываю пример проекта с готовой заполненной таблицей (каюсь, изначально надо было приложить пример).
На всякий случай уточню задачу, скрины прилагаются (см. в примерах алгоритма)



Нужно получить значение ячейки, которая совпадает направляющим "координатам".
Переменная stringtxt_in_row1 на входе может иметь текстовое значение от первой колонки любой строки .
Переменная name_col на входе может иметь текстовое значение от шапки (lv или lt или de или ru или pl).

Пример алгоритма:
* Если "stringtxt_in_row1 = Question1" и "name_col = ru" то получаем результат "result = Ru-answer1" (наглядно так https://i.imgur.com/LI1nAdC.png)
* Если "stringtxt_in_row1 = Apple" и "name_col = de" то получаем результат "result = Apfel" (наглядно так https://i.imgur.com/bML6fjN.png)
* Если "stringtxt_in_row1 = Lemon" и "name_col = lv" то получаем результат "result = Citrons" (наглядно так https://i.imgur.com/Tl6cYGj.png)
* Если "stringtxt_in_row1 = Watermelon" и "name_col = pl" то получаем результат "result = Arbuz" (наглядно так https://i.imgur.com/SV94W4F.png)
* Если "stringtxt_in_row1 = Question5" и "name_col = de" то получаем результат "result = De-answer5" (наглядно так https://i.imgur.com/arsR8Bm.png)
и т.д.
 

Вложения

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
Но не получилось завести снипеты.
С координатами запутались и переменными. var2 не используется, вместо неё result
Код:
string hochesh = project.Variables["input"].Value; //переменная с строкой которую нужно найти
var table = project.Tables["table"];
int colnum1 = 777;
string col1 = project.Variables["name_col"].Value; //переменная с названием столбца в котором нужно найти строку
string[] ta = table.GetRow(0).ToArray(); //берет перевый ряд таблици в массив
//находим номера колонок
for(int i = 0; i < ta.Length; i++)
{
    if(ta[i].Equals(col1)) colnum1 = i; // номер колонки в которой нужно найти строку
}

//тут записывает результат в переменную проекта result
for(int i = 0; i < table.RowCount; i++)
{
   
    if(table.GetCell(0, i).Equals(hochesh))
    {
        project.Variables["result"].Value = table.GetCell(colnum1, i); //тут результат
        break;
    }
}
Вставить вместо вашего кода. Обработку ошибки, колонка не найдена выкинул, для упрощения кода, если нужно, верните потом.
 
  • Спасибо
Реакции: K R, artur23 и kagorec

kagorec

Client
Регистрация
24.08.2013
Сообщения
916
Благодарностей
471
Баллы
63
С координатами запутались и переменными. var2 не используется, вместо неё result
Код:
string hochesh = project.Variables["input"].Value; //переменная с строкой которую нужно найти
var table = project.Tables["table"];
int colnum1 = 777;
string col1 = project.Variables["name_col"].Value; //переменная с названием столбца в котором нужно найти строку
string[] ta = table.GetRow(0).ToArray(); //берет перевый ряд таблици в массив
//находим номера колонок
for(int i = 0; i < ta.Length; i++)
{
    if(ta[i].Equals(col1)) colnum1 = i; // номер колонки в которой нужно найти строку
}

//тут записывает результат в переменную проекта result
for(int i = 0; i < table.RowCount; i++)
{
  
    if(table.GetCell(0, i).Equals(hochesh))
    {
        project.Variables["result"].Value = table.GetCell(colnum1, i); //тут результат
        break;
    }
}
Вставить вместо вашего кода. Обработку ошибки, колонка не найдена выкинул, для упрощения кода, если нужно, верните потом.
Благодарю. Работает!)
 
  • Спасибо
Реакции: artur23

artur23

Client
Регистрация
14.04.2014
Сообщения
205
Благодарностей
15
Баллы
18

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 683
Баллы
113

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