1 1 1 1 1 1 1 1 1 1 Rating 4.42 (6 Votes)
Свой C# код в Зеннопостере для обработки строк

Привет, народ! Буквально месяц назад ко мне обратился один заказчик и поставил задачу написать шаблон для Зеннопостера, который бы выгружал данные с системы планирования ASANA в формате tidy data, чтобы потом можно было импортировать их в Google Data Studio. Впрочем, поставленную задачу я выполнил. Но в процессе поиска информации об ASANA мне встретился один YouTube канал, на котором кроме информации об ASANA я нашел несколько роликов по работе с строками. Мне показалась эта информация полезной, и я решил поделиться ссылками на ролики в этой публикации, и одновременно адаптировать примеры с роликов под Зеннопостер.

Как создать переменную в шаблоне Зеннопостера?

Прежде чем начинать работать с кодом, я покажу на скриншотах как создать переменную в шаблоне Зеннопостера.

  • Открываем окно переменных в программе ProjectMaker и создаем новую локальную переменную. Создаем локальную переменную в Зеннопостере
  • Дальше в окне Проекты нажимаем правую кнопку мышки и последовательно выбираем: Добавить действие - Данные - Обработка переменных. Ищем действие Обработка переменных в Зеннопостере
  • В окне Свойства действия зададим какой-то текст, который хотим присвоить переменной и укажем переменную, в которую он будет сохранен. Присваиваем значение переменной с помощью действия Обработка переменных в Зеннопостере
  • После выполнения данного действия мы можем посмотреть результат в окне Переменных. Смотрим результат выполнения в окне Переменные
  • Но, так как не всегда удобно смотреть изменения в окне Переменных, то можем добавить Оповещение в лог. Нажимаем в окне Проекта правую кнопку мышки и последовательно выбираем: Добавить действие - Логика - Оповещение. Добавление действия Оповещение в Зеннопостере
  • Теперь можно присвоить текст который будет выводиться в лог Зеннопостера и указать значение какой переменной будем добавлять к нашему тексту. Указываем сообщение которое будет выводиться в лог в Зеннопостере
  • Выполняем созданный нами шаблон, и смотрим результат в логе Зеннопостера или ProjectMaker. Свой C# код в Зеннопостере для обработки строк

Как создать переменную в шаблоне Зеннопостера с помощью сниппета?

Как создать локальную переменную в Зеннопостере с помощью сниппета

Так вот, все, что я описал выше - можно реализовать с помощью всего одного кубика Свой C# код, который будет содержать всего три строки. В первой мы создадим переменную в шаблоне с именем text. В второй - присвоим ей значение Hello, World! И в последней - выведем аналогичное уведомление в лог.

  project.Variables.GetType().GetMethod("QuickCreateVariable").Invoke(project.Variables, new Object[]{"text"});  
  project.Variables["text"].Value = "Hello, World!";  
  project.SendInfoToLog(string.Format("Переменная содержит: {0}", project.Variables["text"].Value), true);
 

Думаю, данный пример наглядно демонстрирует, что использование сниппетов позволяет одним кубиком выполнять больше действий. Понятное дело, что не все разбираются в коде. Но, этим и хорош Зеннопостер, что можно автоматизировать все что угодно даже не разбираясь в коде. Просто сохраняем себе готовые примеры и используем их в своих шаблонах, когда желаем получить такой же результат. Но, все таки некоторые базовые штуки знать необходимо - например как получить значение переменной с шаблона в сниппет своего C# кода и как вывести результат выполнения сниппета своего C# кода в переменную шаблона.

Как получить содержимое переменной Зеннопостара внутри своего C# кода?

Обычно этот вопрос решается так - создается текстовая переменная, которой присваивается значение переменной с шаблона:

string text = project.Variables["text"].Value;

Потом уже в своем C# коде с этой переменной проводятся какие-либо манипуляции, и после этого уже делается обратная операция сохранения значения временной переменной, созданной в сниппете своего C# кода в переменную шаблона:

project.Variables["text"].Value = text;

Таким образом, любой из наших сниппетов C# кода будет начинаться с получения данных с шаблона в наш код, и после выполнения необходимых действий - вывод результата в какую либо переменную нашего шаблона.

Конечно, нас никто не заставляет создавать временные переменные в своем коде, можно сразу использовать переменные шаблона. Но, их вид обычно занимает больше букв, из-за чего в коде сложно ориентироваться. Вот, например показанный выше пример вывода уведомления в лог с использованием временной переменной:

string text = "Hello, World!";
project.SendInfoToLog(string.Format("Переменная содержит: {0}", text), true);
project.Variables["text"].Value = text;

Впрочем, как делать конкретно Вам - Вам виднее. Это уже дело вкуса и настроения. Есть пользователи, которые в своих шаблонах всегда используют только переменные в виде project.Variables["text"].Value, а есть и те, кто сразу в первых строках переносит все значения в временные переменные сниппета и в конце просто возвращает результат в переменные шаблона.

Как проверить, пуста ли строка сниппетом в Зеннопостере?

Как проверить, пуста ли строкаВ этом видео рассказывается как проверить пустая строка находится в переменной или нет в C# коде. А так, как Зеннопостер в кубике Свой C# код использует C# код, то пример актуальный для решения наших задач в Зеннопостере. Отличие только в том, что у нас в Зеннопостере уведомления вместо консоли выводятся в лог - естественно это необходимо указывать. Давайте я адаптирую данный пример для Зеннопостера.

Используем метод IsNullOrEmpty

// Проверка IsNullOrEmpty
string text = "Hello, World!";
string text2 = "";
string text3 = null;
string text4 = " ";
project.SendInfoToLog(string.Format("Is Null Or Empty? - 1. {0}", string.IsNullOrEmpty(text)), true);
project.SendInfoToLog(string.Format("Is Null Or Empty? - 2. {0}", string.IsNullOrEmpty(text2)), true);
project.SendInfoToLog(string.Format("Is Null Or Empty? - 3. {0}", string.IsNullOrEmpty(text3)), true);
project.SendInfoToLog(string.Format("Is Null Or Empty? - 4. {0}", string.IsNullOrEmpty(text4)), true);

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

// Проверка IsNullOrEmpty
string[] text = new[]{"Hello, World!", "", null, " "};
for(int i=0; i < text.Length; i++) {
project.SendInfoToLog(string.Format("Is Null Or Empty? - {0}. {1}", i+1, string.IsNullOrEmpty(text[i])), true);
}

Также можно использовать например цикл foreach для перебора элементов массива. Также как и в предыдущем коде - изначально можно не заморачиваться, просто принять во внимание, что в будущем такое решение можно будет использовать.

// Проверка IsNullOrEmpty
string[] text = new[]{"Hello, World!", "", null, " "};
int i = 0;
foreach(string key in text) {
	i++;
	project.SendInfoToLog(string.Format("Is Null Or Empty? - {0}. {1}", i, string.IsNullOrEmpty(key)), true);
}

Используем метод IsNullOrWhiteSpace

О том, чем отличается метод IsNullOrEmpty от метода IsNullOrWhiteSpace Анастасия хорошо рассказала в видео. Собственно адаптированный код под Зеннопостер будет иметь такой вид:

// Проверка IsNullOrWhiteSpace
string[] text = new[]{"Hello, World!", "", null, " ", "\t"};
int i = 0;
foreach(string key in text) {
	i++;
	project.SendInfoToLog(string.Format("Is Null Or Empty? - {0}. {1}", i, string.IsNullOrWhiteSpace(key)), true);
}
Результат проверки строки в Зеннопостере на null и string.Empty

Использование IsNullOrEmpty и IsNullOrWhiteSpace в реальных условиях в сниппете Зеннопостера

И так, если мы вставляли эти коды в свой шаблон Зеннопостера, то увидели примерно такой же результат, как и у автора ролика, только вывод результатов проводился в лог Зеннопостера. Как же использовать данную проверку и зачем она может быть нужна? Пример банальный - в входящих настройках шаблона, который мы делали для какого-то заказчика мы указали к примеру поле ЛОГИН, которое заказчик должен заполнить. Но, по каким-то причинам он забыл его заполнить - и шаблон у него не работает. Как вариант - можно использовать данную проверку, и если такое произошло - завершаем работу шаблона по ошибке с выводом уведомления в лог. Код будет иметь примерно такой вид:

  string login = project.Variables["login"].Value;
  if(string.IsNullOrEmpty(login)||string.IsNullOrWhiteSpace(login)) {
  project.SendErrorToLog("Введите логин в входящих настройках", true);
  return null;
  }
  

Также можно использовать чуток другую конструкцию. Например, если заказчик не указал логин - значит указываем какой-то определенный нами заранее (или с какой-то переменной). Если же логин был указан в входящих настройках - значит указываем его. Пример кода, который можно использовать:

string login = project.Variables["login"].Value;
project.SendInfoToLog("До проверки логин был: " + login, true);
login = string.IsNullOrWhiteSpace(login) ? login : "Наш логин";
project.SendInfoToLog("После проверки логин стал: " + login, true);
  

Как сравнить две строки с учетом (и без учета) регистра сниппетом в Зеннопостере?

Как сравнить две строкиСравнивать строки в C#, а следовательно и в сниппетах программы Зеннопостер можно используя метод string.Compare. Мне лично никогда не приходилось использовать данную фишку в Зеннопостере - пока не представляю, зачем это может понадобиться. Если Вы знаете зачем - напишите об этом в комментариях. А тем временем я покажу как заставить данный пример кода работать в Зеннопостере:

// Возвращаем результат сравнение с помощью string.Compare в лог Зеннопостера
project.SendInfoToLog("a > a : " + string.Compare("a", "a"), true);
project.SendInfoToLog("a > b : " + string.Compare("a", "b"), true);
project.SendInfoToLog("b > a : " + string.Compare("b", "a"), true);
project.SendInfoToLog("ab > abc : " + string.Compare("ab", "abc"), true);
project.SendInfoToLog("a > A : " + string.Compare("a", "A"), true);
project.SendInfoToLog("a > A : " + string.Compare("a", "A", true), true);

project.Variables["text"].Value = string.Compare("a", "a").ToString(); // Возвращаем результат в переменную Зеннопостера

Как перевести строку в верхний/нижний регистр сниппетом в Зеннопостере?

Как перевести строку в верхний/нижний регистрИногда бывает необходимость изменить регистр букв какого-то текста с верхнего на нижний и наоборот. В Зеннопостере это можно выполнить как с помощью стандартных кубиков, так и с помощью своего C# кода. Как мы уже знаем, с помощью сниппетов это бывает удобнее - так как в одном таком кубике можно обработать сразу несколько переменных. Пример, который наводится в видео адаптированный под работу с Зеннопостером выглядит примерно так:

string text = "Hello, World!";
project.SendInfoToLog("Оригинальная строка: " + text, true);
text = text.ToUpper();
project.SendInfoToLog("Строка в верхнем регистре: " + text, true);
text = text.ToLower();
project.SendInfoToLog("Строка в нижнем регистре: " + text, true);

Как проверить есть ли подстрока в строке сниппетом в Зеннопостере?

Как проверить есть ли подстрока в строкеА вот проверка на содержание какой-то подстроки в переменной - это очень даже частое действие, которое приходится использовать в Зеннопостере. Бывает приходится проверять какой кошелек находится в переменной или какой логин авторизированного пользователя на сайте и вообще есть ли логин пользователя на страничке сайта (по этому признаку можно определить авторизировались ли мы в аккаунте или необходимо уводить шаблон по ветке авторизации, примерно также проверяется и наличие каптчи на страничке сайта). Короче говоря, функция полезная, и использовать её необходимо. Адаптированный пример для работы в Зеннопостере выглядит примерно так:

string text = "Hello, world!";
project.SendInfoToLog(string.Format(@"Contains ""world"": {0}",text.Contains("world")), true);
project.SendInfoToLog(string.Format(@"Contains ""hello"": {0}",text.Contains("hello")), true);
project.SendInfoToLog(string.Format(@"Contains ""Hello"": {0}",text.Contains("Hello")), true);
project.SendInfoToLog(string.Format(@"Contains ""hi"": {0}",text.Contains("hi")), true);

Но, может быть такое, что нам необходимо проверить на ряд совпадений. Тогда можно забросить признаки к примеру в массив, после чего уже проверять в цикле. Примерный вид кода, который делает перебор массива с выводом результата в лог:

string text = "Hello, world!";
string[] keys = {"world","hello","Hello","hi"};
foreach(string key in keys) project.SendInfoToLog(string.Format(@"Contains {0}: {1}", key, text.Contains(key)), true);

Естественно, что данную проверку мы проводим, и уже относительно результата выполняем какое-то действие. В реальных условиях проверка на совпадение может иметь такой вид:

string text = "Hello, world!";
string[] keys = {"world","hello","Hello","hi"};
if(text.Contains(keys[0])){
	project.SendInfoToLog("Переменная содержит слово world", true);
}
if(text.Contains(keys[1])){
	project.SendInfoToLog("Переменная содержит слово hello", true);
}
if(text.Contains(keys[2])){
	project.SendInfoToLog("Переменная содержит слово Hello", true);
}
if(text.Contains(keys[3])){
	project.SendInfoToLog("Переменная содержит слово hi", true);
}

В местах, где выводится уведомление мы выполняем какие-то действия в случае, когда совпадение было найдено. Естественно, что если совпадение не найдено - то код выполнен не будет. Еще раз подчеркну - такие конструкции используются в сниппетах Зеннопостера довольно часто, так как это удобно.

Как узнать индекс символа в строке сниппетом в Зеннопостере?

Как узнать индекс символаИногда приходится находить индекс символа в строке. Зачем это может быть необходимо - например для поиска +380 в строке чтобы найти на страничке номер телефона Украинского оператора. Или например для решения антибота на криптовалютных кранах, когда необходимо было прокликать по ссылкам в определенной последовательности. Впрочем, применение может быть разное и моя задача в этой публикации адаптировать пример, который разбирается в ролике, для работы его в Зеннопостере.

string text = "Hello, world!";
string[] keys = {"H","world","it",","};
foreach(string key in keys) project.SendInfoToLog(string.Format(@"Индекс совпадения: {0} : {1}", key, text.IndexOf(key)), true);

Как узнать, начинается/заканчивается ли строка указанной подстрокой сниппетом в Зеннопостере?

Как узнать, заканчивается ли строка подстрокойИ вот помаленьку мы пришли к проверке начала и конца содержимого нашей переменной. Если например переменная начинается с +38097 - значит оператор мобильной связи номера телефона (когда номер имеет 13 знаков естественно) у нас Киевстар, если же начинается на +38063 - значит оператор Лайф :) Пример, который приводится в ролике адаптированный под работу в шаблоне Зеннопостера привожу ниже (в первых двух циклах проверяем начало строки на наличие подстроки, во вторых - проверяем завершается ли значение нашей переменной на указанную нами подстроку):

string text = "Hello, world!";
string[] keys = {"Hello","hello","world!","World!"};
foreach(string key in keys) project.SendInfoToLog(string.Format(@"Начинается с: {0} : {1}", key, text.StartsWith(key)), true);
foreach(string key in keys) project.SendInfoToLog(string.Format(@"Начинается с: {0} + игнорируем регистр: {1}", key, text.StartsWith(key, true, null)), true);

foreach(string key in keys) project.SendInfoToLog(string.Format(@"Заканчивается на: {0} : {1}", key, text.EndsWith(key)), true);
foreach(string key in keys) project.SendInfoToLog(string.Format(@"Заканчивается на: {0} + игнорируем регистр: {1}", key, text.EndsWith(key, true, null)), true);

Как вставить подстроку в строку, начиная с указанной позиции сниппетом в Зеннопостере?

Как вставить подстроку в строкуБывает такое, что необходимо например внутри номера телефона проставить знаки "+", "-", "(", ")" и мы точно знаем в каком месте они должны находиться внутри нашей переменной, которая содержит номер в виде 380971234567. Для реализации такой задачи мы можем воспользоваться методом C# Insert который позволяет вставлять подстроку в указанную нами позицию. В видео об этом рассказывается подробно, а адаптированный пример, который будет работать в Зеннопостере находится ниже по тексту:

string text = "Hello world!";
project.SendInfoToLog(string.Format(@"Оригинальная строка: {0}",text),true);
text = text.Insert(5,",");
project.SendInfoToLog(string.Format(@"Вставили запятую в 4-ю позицию: {0}",text),true);
text = text.Insert(0,"Привет, Мир! ");
project.SendInfoToLog(string.Format(@"Вставили в 0-ю позицию подстроку Привет, Мир!: {0}",text),true);

Основываясь на этом давайте рассмотрим рабочий пример приведения номера телефона, который мы получили на OLX в виде 380971234567 к виду +38 (097) 123-4567. Пример кода, который выполнит это преобразование с использованием метода Insert приведу ниже. Естественно, когда мы будем использовать такой код в своем шаблоне, то будет уместно удалить строки которые выводят уведомления на каждом шаге.

string numer = "380971234567";
project.SendInfoToLog(string.Format(@"Номер который мы спарсили: {0}",numer),true);
numer = numer.Insert(0,"+");
project.SendInfoToLog(string.Format(@"Вставили в начало знак ""+"": {0}",numer),true);

numer = numer.Insert(3," (");
project.SendInfoToLog(string.Format(@"Вставили пробел с открывающей скобкой "" ("": {0}",numer),true);

numer = numer.Insert(8,") ");
project.SendInfoToLog(string.Format(@"Вставили закрывающую скобку и пробел "" )"": {0}",numer),true);

numer = numer.Insert(13,"-");
project.SendInfoToLog(string.Format(@"Вставили знак ""-"": {0}",numer),true);
// Результат в переменной numer получили в виде: +38 (097) 123-4567

Как обрезать строку начиная с указанной позиции сниппетом в Зеннопостере?

Как обрезать строку начиная с указанной позицииВозвращаясь к вопросу преобразования строк можем рассмотреть еще пример, когда собрали на YouTube в комментариях или описаниях почтовые ящики, и там встречается что-то в виде login [ гав ] gmail.com и подобные комбинации. Так вот, индекс вхождения этого [ гав ] мы уже находить умеем (выше по тексту об этом рассказывалось). Осталось научиться удалять его - для этого используется метод Remove. Как это работает, рассказывается в ролике, а моя задача предоставить адаптированный под Зеннопостер пример.

string text = "Hello, World!";
project.SendInfoToLog(string.Format(@"Обрезали все после 5-й позиции: {0}",text.Remove(5)),true);
project.SendInfoToLog(string.Format(@"Оставили только первую букву: {0}",text.Remove(1)),true);
project.SendInfoToLog(string.Format(@"Удалили символ, который находится в 5-й позиции: {0}",text.Remove(5,1)),true);

Как удалить пробелы вначале и вконце строки сниппетом в Зеннопостере?

Очень часто, когда мы берем DOM, то в наши переменные попадается текст с пробелами вначале и в конце. Можно конечно заменить пробелы на пустую строку, тем самым удалив их. Но, если внутри переменной находится фраза из нескольких слов, то такой подход просто удалит все пробелы и превратит фразу в набор букв. Так вот для такого случая удобно использовать метод C# Trim, который удаляет пробельные симолы. Пример кода, который работает в Зеннопостере я приведу ниже. Скажу по секрету, использовать его необходимо ВСЕГДА, когда какие-либо данные задаются через входящие настройки, так как мы не можем быть уверенными, что пользователь, который будет пользоваться шаблоном будет следить чтобы в поля случайно не были добавлены лишние пробелы, а это иногда может привести к неработоспособности нашего шаблона.

string text = "          Hello, World!           ";
project.SendInfoToLog("ДО: " + text, true);
project.SendInfoToLog("ПОСЛЕ: " + text.Trim(), true);

Вот такая получилась статья, в которой показано как можно убрать огромный набор стандартных кубиков в своих шаблонах для Зеннопостера и сделать их более лаконичными благодаря использованию сниппетов C# кода для обработки и сравнения строк.

Добавить комментарий


Защитный код
Обновить

Комментарии   

pavel
0 # pavel 05.08.2018 01:27
Слушай, создание переменных через C# это вышка, на счет string.Compare тоже спасибо. Я пользуюсь этим в диалогах telegramBot с пользователем, на каждую кнопку свой ответ, по default не всегда представляется возможным, сверяю два последних ответа от пользователя на дубли, чтобы бот не слал дважды одно меню. Возможно есть проще способы, я пока не придумал.
Ответить | Сообщить модератору
BigBoss
0 # BigBoss 02.02.2018 17:08
Спасибо, бро за труды. Все расписал, будем курить)
Ответить | Сообщить модератору