Бесплатные снипеты на заказ

Ilshakin

Client
Joined
Feb 14, 2017
Messages
644
Reaction score
587
Points
93
@Alexmd @Ilshakin
Помогите со сниппетом.
Нужно сгенерировать числа от 0 до 10000 с интервалом 25
т.е
0
25
50
75
90
.
.
сам пользуюсь Enumerable.Range: https://zennolab.com/discussion/threads/pomogite-sgenerirovat-chislo-kratnoe-5.106724/post-707157
есть такой товарищ, как StringBuilder - он шустрее работает, но это все крохи:

C#:
var st = System.Diagnostics.Stopwatch.StartNew();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000000000; i += 25)
{
    sb.AppendLine(i.ToString());
}
project.Lists["list"].AddRange(sb.ToString().Split(new [] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList());
return st.Elapsed;
//Выполнение кода C#  Результат: 00:00:09.5109607
 
  • Thank you
Reactions: Alexmd and udder

Alexmd

Client
Joined
Dec 10, 2018
Messages
1,021
Reaction score
1,427
Points
113
сам пользуюсь Enumerable.Range: https://zennolab.com/discussion/threads/pomogite-sgenerirovat-chislo-kratnoe-5.106724/post-707157
есть такой товарищ, как StringBuilder - он шустрее работает, но это все крохи:

C#:
var st = System.Diagnostics.Stopwatch.StartNew();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000000000; i += 25)
{
    sb.AppendLine(i.ToString());
}
project.Lists["list"].AddRange(sb.ToString().Split(new [] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList());
return st.Elapsed;
//Выполнение кода C#  Результат: 00:00:09.5109607
@Ilshakin , ты на квантовом компьютере работаешь или лукавишь? так как в твоем варианте очевидно много лишних действий. Признавайся, опять у ИИ спрашивал?
у меня так твой код отработал
C#:
var st = System.Diagnostics.Stopwatch.StartNew();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000000000; i += 25)
{
    sb.AppendLine(i.ToString());
}
project.Lists["list"].AddRange(sb.ToString().Split(new [] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList());
return st.Elapsed;
//Выполнение кода C#  Результат: 00:00:35.4714225
Запусти-ка следующий пример, который у меня оказался самым продуктивным из всех предложенных
C#:
var st = System.Diagnostics.Stopwatch.StartNew();
project.Lists["list"].AddRange(Enumerable.Range(0,1000000000).Where(x=>x % 25 == 0).OfType<string>());
return st.Elapsed;
//Выполнение кода C#  Результат: 00:00:21.1881713
upd
Ну и коллективным разумом мы все-таки добились оптимального решения
C#:
var st = System.Diagnostics.Stopwatch.StartNew();
List<int> list = new List<int>();
for(int i = 0; i < 1000000000; i+=25)
    list.Add(i);
project.Lists["list"].AddRange(list.OfType<string>());
return st.Elapsed;
//Выполнение кода C#  Результат: 00:00:03.8400789
 
Last edited:

Ilshakin

Client
Joined
Feb 14, 2017
Messages
644
Reaction score
587
Points
93
@Ilshakin , ты на квантовом компьютере работаешь или лукавишь? так как в твоем варианте очевидно много лишних действий. Признавайся, опять у ИИ спрашивал?
у меня так твой код отработал
C#:
var st = System.Diagnostics.Stopwatch.StartNew();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000000000; i += 25)
{
    sb.AppendLine(i.ToString());
}
project.Lists["list"].AddRange(sb.ToString().Split(new [] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList());
return st.Elapsed;
//Выполнение кода C#  Результат: 00:00:35.4714225
Запусти-ка следующий пример, который у меня оказался самым продуктивным из всех предложенных
C#:
var st = System.Diagnostics.Stopwatch.StartNew();
project.Lists["list"].AddRange(Enumerable.Range(0,1000000000).Where(x=>x % 25 == 0).OfType<string>());
return st.Elapsed;
//Выполнение кода C#  Результат: 00:00:21.1881713
upd
Ну и коллективным разумом мы все-таки добились оптимального решения
C#:
var st = System.Diagnostics.Stopwatch.StartNew();
List<int> list = new List<int>();
for(int i = 0; i < 1000000000; i+=25)
    list.Add(i);
project.Lists["list"].AddRange(list.OfType<string>());
return st.Elapsed;
//Выполнение кода C#  Результат: 00:00:03.8400789
как то в прошлом году в одном из шаблонов заказчика необходимо было генерировать токен для антифрод-системы
с их параллельным массовым чеком, дабы дернуть валидные ...
использовал Enumerable.Range, чисто как пример:
C#:
var res = Enumerable.Range(1, 1000000000).Select(x => Guid.NewGuid().ToString("n"));
так вот через StringBuilder - подобная операция была быстрее на ~20% (это отвечая на вопрос, обращался ли я к ИИ)

твои примеры, что ты попросил запустить и пример из "коллективного разума" у меня не сработал ....

 
  • Thank you
Reactions: Alexmd

samsonnn

Client
Joined
Jun 2, 2015
Messages
1,899
Reaction score
1,641
Points
113
upd
Ну и коллективным разумом мы все-таки добились оптимального решения
C#:
var st = System.Diagnostics.Stopwatch.StartNew();
List<int> list = new List<int>();
for(int i = 0; i < 1000000000; i+=25)
    list.Add(i);
project.Lists["list"].AddRange(list.OfType<string>());
return st.Elapsed;
//Выполнение кода C#  Результат: 00:00:03.8400789
:ay:
 

Alexmd

Client
Joined
Dec 10, 2018
Messages
1,021
Reaction score
1,427
Points
113
как то в прошлом году в одном из шаблонов заказчика необходимо было генерировать токен для антифрод-системы
с их параллельным массовым чеком, дабы дернуть валидные ...
использовал Enumerable.Range, чисто как пример:
C#:
var res = Enumerable.Range(1, 1000000000).Select(x => Guid.NewGuid().ToString("n"));
так вот через StringBuilder - подобная операция была быстрее на ~20% (это отвечая на вопрос, обращался ли я к ИИ)

твои примеры, что ты попросил запустить и пример из "коллективного разума" у меня не сработал ....

точняк. тупанул я с oftype. позор мне
все равно, с числами надо работать, как с числами, а не как со строками
Получается, этот код у меня работает в 2 раза быстрее, чем StringBuilder
C#:
var st = System.Diagnostics.Stopwatch.StartNew();
List<int> list = new List<int>();
for(int i = 0; i < 1000000000; i+=25)
    list.Add(i);
project.Lists["list"].AddRange(list.Select(i=>i.ToString()));
return st.Elapsed;
//Выполнение кода C#  Результат: 00:00:19.3945804
 
Last edited:
  • Thank you
Reactions: Ilshakin

Ilshakin

Client
Joined
Feb 14, 2017
Messages
644
Reaction score
587
Points
93
  • Thank you
Reactions: Alexmd

SVRyzhov

Client
Joined
May 17, 2017
Messages
52
Reaction score
6
Points
8
Добрый день!
Подскажите код чтоб прикрутить сие чудо
Код с хабра:
public class DistanceAlferov {
        class Word {
            public string Text { get; set; }
            public List<int> Codes { get; set; } = new List<int>();
        }
        class AnalizeObject {
            public string Origianl { get; set; }
            public List<Word> Words { get; set; } = new List<Word>();
        }
        class LanguageSet {
            public AnalizeObject Rus { get; set; } = new AnalizeObject();
            public AnalizeObject Eng { get; set; } = new AnalizeObject();
        }
        List<LanguageSet> Samples { get; set; } = new List<LanguageSet>();
        public void SetData(List<Tuple<string, string>> datas) {
            List<KeyValuePair<char, int>> codeKeys = CodeKeysRus.Concat(CodeKeysEng).ToList();
            foreach (var data in datas) {
                LanguageSet languageSet = new LanguageSet();
                languageSet.Rus.Origianl = data.Item1;
                if (data.Item1.Length > 0) {
                    languageSet.Rus.Words = data.Item1.Split(' ').Select(w => new Word() {
                        Text = w.ToLower(),
                        Codes = GetKeyCodes(codeKeys, w)
                    }).ToList();
                }
                languageSet.Eng.Origianl = data.Item2;
                if (data.Item2.Length > 0) {
                    languageSet.Eng.Words = data.Item2.Split(' ').Select(w => new Word() {
                        Text = w.ToLower(),
                        Codes = GetKeyCodes(codeKeys, w)
                    }).ToList();
                }
                this.Samples.Add(languageSet);
            }
        }
        public List<Tuple<string, string, double, int>> Search(string targetStr) {
            List<KeyValuePair<char, int>> codeKeys = CodeKeysRus.Concat(CodeKeysEng).ToList();
            AnalizeObject originalSearchObj = new AnalizeObject();
            if (targetStr.Length > 0) {
                originalSearchObj.Words = targetStr.Split(' ').Select(w => new Word() {
                    Text = w.ToLower(),
                    Codes = GetKeyCodes(codeKeys, w)
                }).ToList();
            }
            AnalizeObject translationSearchObj = new AnalizeObject();
            if (targetStr.Length > 0) {
                translationSearchObj.Words = targetStr.Split(' ').Select(w => {
                    string translateStr = Transliterate(w.ToLower(), Translit_Ru_En);
                    return new Word() {
                        Text = translateStr,
                        Codes = GetKeyCodes(codeKeys, translateStr)
                    };
                }).ToList();
            }
            var result = new List<Tuple<string, string, double, int>>();
            foreach (LanguageSet sampl in Samples) {
                int languageType = 1;
                double cost = GetRangePhrase(sampl.Rus, originalSearchObj, false);
                double tempCost = GetRangePhrase(sampl.Eng, originalSearchObj, false);
                if (cost > tempCost) {
                    cost = tempCost;
                    languageType = 3;
                }
                // Проверка транслетерационной строки
                tempCost = GetRangePhrase(sampl.Rus, translationSearchObj, true);
                if (cost > tempCost) {
                    cost = tempCost;
                    languageType = 2;
                }
                tempCost = GetRangePhrase(sampl.Eng, translationSearchObj, true);
                if (cost > tempCost) {
                    cost = tempCost;
                    languageType = 3;
                }
                result.Add(new Tuple<string, string, double, int>(sampl.Rus.Origianl, sampl.Eng.Origianl, cost, languageType));
            }
            return result;
        }
        private double GetRangePhrase(AnalizeObject source, AnalizeObject search, bool translation) {
            if (!source.Words.Any()) {
                if (!search.Words.Any())
                    return 0;
                return search.Words.Sum(w => w.Text.Length) * 2 * 100;
            }
            if (!search.Words.Any()) {
                return source.Words.Sum(w => w.Text.Length) * 2 * 100;
            }
            double result = 0;
            for (int i = 0; i < search.Words.Count; i++) {
                double minRangeWord = double.MaxValue;
                int minIndex = 0;
                for (int j = 0; j < source.Words.Count; j++) {
                    double currentRangeWord = GetRangeWord(source.Words[j], search.Words[i], translation);
                    if (currentRangeWord < minRangeWord) {
                        minRangeWord = currentRangeWord;
                        minIndex = j;
                    }
                }
                result += minRangeWord * 100 + (Math.Abs(i - minIndex) / 10.0);
            }
            return result;
        }
        private double GetRangeWord(Word source, Word target, bool translation) {
            double minDistance = double.MaxValue;
            Word croppedSource = new Word();
            int length = Math.Min(source.Text.Length, target.Text.Length + 1);
            for (int i = 0; i <= source.Text.Length - length; i++) {
                croppedSource.Text = source.Text.Substring(i, length);
                croppedSource.Codes = source.Codes.Skip(i).Take(length).ToList();
                minDistance = Math.Min(minDistance, LevenshteinDistance(croppedSource, target, croppedSource.Text.Length == source.Text.Length, translation) + (i * 2 / 10.0));
            }
            return minDistance;
        }
        private int LevenshteinDistance(Word source, Word target, bool fullWord, bool translation) {
            if (String.IsNullOrEmpty(source.Text)) {
                if (String.IsNullOrEmpty(target.Text))
                    return 0;
                return target.Text.Length * 2;
            }
            if (String.IsNullOrEmpty(target.Text))
                return source.Text.Length * 2;
            int n = source.Text.Length;
            int m = target.Text.Length;
            //TODO Убрать в параметры (для оптимизации)
            int[,] distance = new int[3, m + 1];
            // Initialize the distance 'matrix'
            for (var j = 1; j <= m; j++)
                distance[0, j] = j * 2;
            var currentRow = 0;
            for (var i = 1; i <= n; ++i) {
                currentRow = i % 3;
                var previousRow = (i - 1) % 3;
                distance[currentRow, 0] = i * 2;
                for (var j = 1; j <= m; j++) {
                    distance[currentRow, j] = Math.Min(Math.Min(
                                distance[previousRow, j] + ((!fullWord && i == n) ? 2 - 1 : 2),
                                distance[currentRow, j - 1] + ((!fullWord && i == n) ? 2 - 1 : 2)),
                                distance[previousRow, j - 1] + CostDistanceSymbol(source, i - 1, target, j - 1, translation));

                    if (i > 1 && j > 1 && source.Text[i - 1] == target.Text[j - 2]
                                       && source.Text[i - 2] == target.Text[j - 1]) {
                        distance[currentRow, j] = Math.Min(distance[currentRow, j], distance[(i - 2) % 3, j - 2] + 2);
                    }
                }
            }
            return distance[currentRow, m];
        }
        private int CostDistanceSymbol(Word source, int sourcePosition, Word search, int searchPosition, bool translation) {
            if (source.Text[sourcePosition] == search.Text[searchPosition])
                return 0;
            if (translation)
                return 2;
            if (source.Codes[sourcePosition] != 0 && source.Codes[sourcePosition] == search.Codes[searchPosition])
                return 0;
            int resultWeight = 0;
            List<int> nearKeys;
            if (!DistanceCodeKey.TryGetValue(source.Codes[sourcePosition], out nearKeys))
                resultWeight = 2;
            else
                resultWeight = nearKeys.Contains(search.Codes[searchPosition]) ? 1 : 2;
            List<char> phoneticGroups;
            if (PhoneticGroupsRus.TryGetValue(search.Text[searchPosition], out phoneticGroups))
                resultWeight = Math.Min(resultWeight, phoneticGroups.Contains(source.Text[sourcePosition]) ? 1 : 2);
            if (PhoneticGroupsEng.TryGetValue(search.Text[searchPosition], out phoneticGroups))
                resultWeight = Math.Min(resultWeight, phoneticGroups.Contains(source.Text[sourcePosition]) ? 1 : 2);
            return resultWeight;
        }
        private List<int> GetKeyCodes(List<KeyValuePair<char, int>> codeKeys, string word) {
            return word.ToLower().Select(ch => codeKeys.FirstOrDefault(ck => ck.Key == ch).Value).ToList();
        }
        private string Transliterate(string text, Dictionary<char, string> cultureFrom) {
            IEnumerable<char> translateText = text.SelectMany(t => {
                string translateChar;
                if (cultureFrom.TryGetValue(t, out translateChar))
                    return translateChar;
                return t.ToString();
            });
            return string.Concat(translateText);
        }
        #region Блок Фонетических групп
        static Dictionary<char, List<char>> PhoneticGroupsRus = new Dictionary<char, List<char>>();
        static Dictionary<char, List<char>> PhoneticGroupsEng = new Dictionary<char, List<char>>();
        #endregion
        static DistanceAlferov() {
            SetPhoneticGroups(PhoneticGroupsRus, new List<string>() { "ыий", "эе", "ая", "оёе", "ую", "шщ", "оа" });
            SetPhoneticGroups(PhoneticGroupsEng, new List<string>() { "aeiouy", "bp", "ckq", "dt", "lr", "mn", "gj", "fpv", "sxz", "csz" });
        }
        private static void SetPhoneticGroups(Dictionary<char, List<char>> resultPhoneticGroups, List<string> phoneticGroups) {
            foreach (string group in phoneticGroups)
                foreach (char symbol in group)
                    if (!resultPhoneticGroups.ContainsKey(symbol))
                        resultPhoneticGroups.Add(symbol, phoneticGroups.Where(pg => pg.Contains(symbol)).SelectMany(pg => pg).Distinct().Where(ch => ch != symbol).ToList());
        }
        #region Блок для сопоставления клавиатуры
        /// <summary>
        /// Близость кнопок клавиатуры
        /// </summary>
        private static Dictionary<int, List<int>> DistanceCodeKey = new Dictionary<int, List<int>>
        {
            /* '`' */ { 192 , new List<int>(){ 49 }},
            /* '1' */ { 49 , new List<int>(){ 50, 87, 81 }},
            /* '2' */ { 50 , new List<int>(){ 49, 81, 87, 69, 51 }},
            /* '3' */ { 51 , new List<int>(){ 50, 87, 69, 82, 52 }},
            /* '4' */ { 52 , new List<int>(){ 51, 69, 82, 84, 53 }},
            /* '5' */ { 53 , new List<int>(){ 52, 82, 84, 89, 54 }},
            /* '6' */ { 54 , new List<int>(){ 53, 84, 89, 85, 55 }},
            /* '7' */ { 55 , new List<int>(){ 54, 89, 85, 73, 56 }},
            /* '8' */ { 56 , new List<int>(){ 55, 85, 73, 79, 57 }},
            /* '9' */ { 57 , new List<int>(){ 56, 73, 79, 80, 48 }},
            /* '0' */ { 48 , new List<int>(){ 57, 79, 80, 219, 189 }},
            /* '-' */ { 189 , new List<int>(){ 48, 80, 219, 221, 187 }},
            /* '+' */ { 187 , new List<int>(){ 189, 219, 221 }},
            /* 'q' */ { 81 , new List<int>(){ 49, 50, 87, 83, 65 }},
            /* 'w' */ { 87 , new List<int>(){ 49, 81, 65, 83, 68, 69, 51, 50 }},
            /* 'e' */ { 69 , new List<int>(){ 50, 87, 83, 68, 70, 82, 52, 51 }},
            /* 'r' */ { 82 , new List<int>(){ 51, 69, 68, 70, 71, 84, 53, 52 }},
            /* 't' */ { 84 , new List<int>(){ 52, 82, 70, 71, 72, 89, 54, 53 }},
            /* 'y' */ { 89 , new List<int>(){ 53, 84, 71, 72, 74, 85, 55, 54 }},
            /* 'u' */ { 85 , new List<int>(){ 54, 89, 72, 74, 75, 73, 56, 55 }},
            /* 'i' */ { 73 , new List<int>(){ 55, 85, 74, 75, 76, 79, 57, 56 }},
            /* 'o' */ { 79 , new List<int>(){ 56, 73, 75, 76, 186, 80, 48, 57 }},
            /* 'p' */ { 80 , new List<int>(){ 57, 79, 76, 186, 222, 219, 189, 48 }},
            /* '[' */ { 219 , new List<int>(){ 48, 186, 222, 221, 187, 189 }},
            /* ']' */ { 221 , new List<int>(){ 189, 219, 187 }},
            /* 'a' */ { 65 , new List<int>(){ 81, 87, 83, 88, 90 }},
            /* 's' */ { 83 , new List<int>(){ 81, 65, 90, 88, 67, 68, 69, 87, 81 }},
            /* 'd' */ { 68 , new List<int>(){ 87, 83, 88, 67, 86, 70, 82, 69 }},
            /* 'f' */ { 70 , new List<int>(){ 69, 68, 67, 86, 66, 71, 84, 82 }},
            /* 'g' */ { 71 , new List<int>(){ 82, 70, 86, 66, 78, 72, 89, 84 }},
            /* 'h' */ { 72 , new List<int>(){ 84, 71, 66, 78, 77, 74, 85, 89 }},
            /* 'j' */ { 74 , new List<int>(){ 89, 72, 78, 77, 188, 75, 73, 85 }},
            /* 'k' */ { 75 , new List<int>(){ 85, 74, 77, 188, 190, 76, 79, 73 }},
            /* 'l' */ { 76 , new List<int>(){ 73, 75, 188, 190, 191, 186, 80, 79 }},
            /* ';' */ { 186 , new List<int>(){ 79, 76, 190, 191, 222, 219, 80 }},
            /* '\''*/ { 222 , new List<int>(){ 80, 186, 191, 221, 219 }},
            /* 'z' */ { 90 , new List<int>(){ 65, 83, 88 }},
            /* 'x' */ { 88 , new List<int>(){ 90, 65, 83, 68, 67 }},
            /* 'c' */ { 67 , new List<int>(){ 88, 83, 68, 70, 86 }},
            /* 'v' */ { 86 , new List<int>(){ 67, 68, 70, 71, 66 }},
            /* 'b' */ { 66 , new List<int>(){ 86, 70, 71, 72, 78 }},
            /* 'n' */ { 78 , new List<int>(){ 66, 71, 72, 74, 77 }},
            /* 'm' */ { 77 , new List<int>(){ 78, 72, 74, 75, 188 }},
            /* '<' */ { 188 , new List<int>(){ 77, 74, 75, 76, 190 }},
            /* '>' */ { 190 , new List<int>(){ 188, 75, 76, 186, 191 }},
            /* '?' */ { 191 , new List<int>(){ 190, 76, 186, 222 }},
        };
        /// <summary>
        /// Коды клавиш русскоязычной клавиатуры
        /// </summary>
        private static Dictionary<char, int> CodeKeysRus = new Dictionary<char, int>
        {
            { 'ё' , 192  },
            { '1' , 49  },
            { '2' , 50  },
            { '3' , 51  },
            { '4' , 52  },
            { '5' , 53  },
            { '6' , 54  },
            { '7' , 55  },
            { '8' , 56  },
            { '9' , 57  },
            { '0' , 48  },
            { '-' , 189 },
            { '=' , 187 },
            { 'й' , 81  },
            { 'ц' , 87  },
            { 'у' , 69  },
            { 'к' , 82  },
            { 'е' , 84  },
            { 'н' , 89  },
            { 'г' , 85  },
            { 'ш' , 73  },
            { 'щ' , 79  },
            { 'з' , 80  },
            { 'х' , 219 },
            { 'ъ' , 221 },
            { 'ф' , 65  },
            { 'ы' , 83  },
            { 'в' , 68  },
            { 'а' , 70  },
            { 'п' , 71  },
            { 'р' , 72  },
            { 'о' , 74  },
            { 'л' , 75  },
            { 'д' , 76  },
            { 'ж' , 186 },
            { 'э' , 222 },
            { 'я' , 90  },
            { 'ч' , 88  },
            { 'с' , 67  },
            { 'м' , 86  },
            { 'и' , 66  },
            { 'т' , 78  },
            { 'ь' , 77  },
            { 'б' , 188 },
            { 'ю' , 190 },
            { '.' , 191 },

            { '!' , 49  },
            { '"' , 50  },
            { '№' , 51  },
            { ';' , 52  },
            { '%' , 53  },
            { ':' , 54  },
            { '?' , 55  },
            { '*' , 56  },
            { '(' , 57  },
            { ')' , 48  },
            { '_' , 189 },
            { '+' , 187 },
            { ',' , 191 },
        };
        /// <summary>
        /// Коды клавиш англиской клавиатуры
        /// </summary>
        private static Dictionary<char, int> CodeKeysEng = new Dictionary<char, int>
        {
            { '`', 192 },
            { '1', 49   },
            { '2', 50   },
            { '3', 51   },
            { '4', 52   },
            { '5', 53   },
            { '6', 54   },
            { '7', 55   },
            { '8', 56   },
            { '9', 57   },
            { '0', 48   },
            { '-', 189  },
            { '=', 187  },
            { 'q', 81   },
            { 'w', 87   },
            { 'e', 69   },
            { 'r', 82   },
            { 't', 84   },
            { 'y', 89   },
            { 'u', 85   },
            { 'i', 73   },
            { 'o', 79   },
            { 'p', 80   },
            { '[', 219  },
            { ']', 221  },
            { 'a', 65   },
            { 's', 83   },
            { 'd', 68   },
            { 'f', 70   },
            { 'g', 71   },
            { 'h', 72   },
            { 'j', 74   },
            { 'k', 75   },
            { 'l', 76   },
            { ';', 186  },
            { '\'', 222 },
            { 'z', 90   },
            { 'x', 88   },
            { 'c', 67   },
            { 'v', 86   },
            { 'b', 66   },
            { 'n', 78   },
            { 'm', 77   },
            { ',', 188  },
            { '.', 190  },
            { '/', 191  },

            { '~' , 192 },
            { '!' , 49  },
            { '@' , 50  },
            { '#' , 51  },
            { '$' , 52  },
            { '%' , 53  },
            { '^' , 54  },
            { '&' , 55  },
            { '*' , 56  },
            { '(' , 57  },
            { ')' , 48  },
            { '_' , 189 },
            { '+' , 187 },

            { '{', 219  },
            { '}', 221  },
            { ':', 186  },
            { '"', 222  },

            { '<', 188  },
            { '>', 190  },
            { '?', 191  },
        };
        #endregion
        #region Блок транслитерации
        /// <summary>
        /// Транслитерация Русский => ASCII (ISO 9-95)
        /// </summary>
        private static Dictionary<char, string> Translit_Ru_En = new Dictionary<char, string>
        {
            { 'а', "a" },
            { 'б', "b" },
            { 'в', "v" },
            { 'г', "g" },
            { 'д', "d" },
            { 'е', "e" },
            { 'ё', "yo" },
            { 'ж', "zh" },
            { 'з', "z" },
            { 'и', "i" },
            { 'й', "i" },
            { 'к', "k" },
            { 'л', "l" },
            { 'м', "m" },
            { 'н', "n" },
            { 'о', "o" },
            { 'п', "p" },
            { 'р', "r" },
            { 'с', "s" },
            { 'т', "t" },
            { 'у', "u" },
            { 'ф', "f" },
            { 'х', "x" },
            { 'ц', "c" },
            { 'ч', "ch" },
            { 'ш', "sh" },
            { 'щ', "shh" },
            { 'ъ', "" },
            { 'ы', "y" },
            { 'ь', "'" },
            { 'э', "e" },
            { 'ю', "yu" },
            { 'я', "ya" },
        };
        #endregion
    }
Источник https://habr.com/ru/articles/331174/
Нужен нечеткий поиск по списку
 

rsgobe23

Новичок
Joined
Apr 26, 2023
Messages
15
Reaction score
1
Points
3
Привет, нужна помощь, у меня такая задача:
Я регаю акаунты почтового сервиса. Я пробую у себя на телефоне у меня одни капчи (очень простые), а через зенку другие (очень сложные) как мне добится значения как на телефоне?
(FиnCaptcha)
 

Sanekk

Client
Joined
Jun 24, 2016
Messages
999
Reaction score
390
Points
63
Приветстувю!
С математикой не силён, задача такая:
Например есть 3 склада (main_warehouse,warehouse_1,warehouse_2), на главном остаток в 9 шт, нужно 4 шт оставить в резерве, а остальные 5 шт распределить по двум складам.
Собственно код получился такой:

C#:
float main_warehouse = 9;// остаток на главном складе

float reserve = 4;// оставить резерв
    
main_warehouse = main_warehouse - reserve;// остаток на главном складе с учётом вычета резерва

float warehouse_1 = main_warehouse/2;
float warehouse_2 = main_warehouse/2;

project.SendWarningToLog("Остаток на warehouse_1 = " + warehouse_1,false);
project.SendWarningToLog("Остаток на warehouse_2 = " + warehouse_2,false);
По результатам видим что поделив 5 на 2 получаем по 2.5, но товар же не можем разделить пополам, надо что бы на одном складе было 3 шт, на другом 2 шт.
Второй момент, сделать приоритетным склад warehouse_1 , тоесть если после вычисления кол-во не равно , то там где остаток больше присваевается warehouse_1
 

samsonnn

Client
Joined
Jun 2, 2015
Messages
1,899
Reaction score
1,641
Points
113
Приветстувю!
С математикой не силён, задача такая:
Например есть 3 склада (main_warehouse,warehouse_1,warehouse_2), на главном остаток в 9 шт, нужно 4 шт оставить в резерве, а остальные 5 шт распределить по двум складам.
Собственно код получился такой:

C#:
float main_warehouse = 9;// остаток на главном складе

float reserve = 4;// оставить резерв

main_warehouse = main_warehouse - reserve;// остаток на главном складе с учётом вычета резерва

float warehouse_1 = main_warehouse/2;
float warehouse_2 = main_warehouse/2;

project.SendWarningToLog("Остаток на warehouse_1 = " + warehouse_1,false);
project.SendWarningToLog("Остаток на warehouse_2 = " + warehouse_2,false);
По результатам видим что поделив 5 на 2 получаем по 2.5, но товар же не можем разделить пополам, надо что бы на одном складе было 3 шт, на другом 2 шт.
Второй момент, сделать приоритетным склад warehouse_1 , тоесть если после вычисления кол-во не равно , то там где остаток больше присваевается warehouse_1
C#:
int mainWarehouse = 9;
int reserve = 4;
int remainingItems = mainWarehouse - reserve;
if (remainingItems > 0)
{
  int warehouse2 = remainingItems / 2;
  int warehouse1 = remainingItems - warehouse2;

  project.SendInfoToLog($"Склад warehouse_1: {warehouse1}", true);
  project.SendInfoToLog($"Склад warehouse_2: {warehouse2}", true);
}
else
{
   throw new Exception("Невозможно распределить товар между складами!");
}
 
Last edited:
  • Thank you
Reactions: Sanekk

doc

Client
Joined
Mar 30, 2012
Messages
8,685
Reaction score
4,650
Points
113
Приветстувю!
С математикой не силён, задача такая:
Например есть 3 склада (main_warehouse,warehouse_1,warehouse_2), на главном остаток в 9 шт, нужно 4 шт оставить в резерве, а остальные 5 шт распределить по двум складам.
Собственно код получился такой:

C#:
float main_warehouse = 9;// остаток на главном складе

float reserve = 4;// оставить резерв
   
main_warehouse = main_warehouse - reserve;// остаток на главном складе с учётом вычета резерва

float warehouse_1 = main_warehouse/2;
float warehouse_2 = main_warehouse/2;

project.SendWarningToLog("Остаток на warehouse_1 = " + warehouse_1,false);
project.SendWarningToLog("Остаток на warehouse_2 = " + warehouse_2,false);
По результатам видим что поделив 5 на 2 получаем по 2.5, но товар же не можем разделить пополам, надо что бы на одном складе было 3 шт, на другом 2 шт.
Второй момент, сделать приоритетным склад warehouse_1 , тоесть если после вычисления кол-во не равно , то там где остаток больше присваевается warehouse_1
C#:
int main_warehouse = 9;// остаток на главном складе

int reserve = 4;// оставить резерв
    
main_warehouse = main_warehouse - reserve;// остаток на главном складе с учётом вычета резерва

int warehouse_2 = main_warehouse/2;
int warehouse_1 = main_warehouse - warehouse_2;

project.SendWarningToLog("Остаток на warehouse_1 = " + warehouse_1.ToString(),false);
project.SendWarningToLog("Остаток на warehouse_2 = " + warehouse_2.ToString(),false);
 
  • Thank you
Reactions: Sanekk

Vasyl1

Client
Joined
Dec 11, 2016
Messages
204
Reaction score
23
Points
18
Приветстувю!
С математикой не силён, задача такая:
Например есть 3 склада (main_warehouse,warehouse_1,warehouse_2), на главном остаток в 9 шт, нужно 4 шт оставить в резерве, а остальные 5 шт распределить по двум складам.
Собственно код получился такой:

C#:
float main_warehouse = 9;// остаток на главном складе

float reserve = 4;// оставить резерв
   
main_warehouse = main_warehouse - reserve;// остаток на главном складе с учётом вычета резерва

float warehouse_1 = main_warehouse/2;
float warehouse_2 = main_warehouse/2;

project.SendWarningToLog("Остаток на warehouse_1 = " + warehouse_1,false);
project.SendWarningToLog("Остаток на warehouse_2 = " + warehouse_2,false);
По результатам видим что поделив 5 на 2 получаем по 2.5, но товар же не можем разделить пополам, надо что бы на одном складе было 3 шт, на другом 2 шт.
Второй момент, сделать приоритетным склад warehouse_1 , тоесть если после вычисления кол-во не равно , то там где остаток больше присваевается warehouse_1
ChatGPT дал ответ)

C#:
float main_warehouse = 9; // остаток на главном складе
float reserve = 4; // оставить резерв

main_warehouse = main_warehouse - reserve; // остаток на главном складе с учетом вычета резерва

float warehouse_1 = 0;
float warehouse_2 = 0;

if (main_warehouse % 2 == 0) {
    warehouse_1 = main_warehouse / 2;
    warehouse_2 = main_warehouse / 2;
} else {
    warehouse_1 = (main_warehouse + 1) / 2;
    warehouse_2 = (main_warehouse - 1) / 2;
}

if (warehouse_1 < warehouse_2) {
    float temp = warehouse_1;
    warehouse_1 = warehouse_2;
    warehouse_2 = temp;
}

project.SendWarningToLog("Остаток на warehouse_1 = " + warehouse_1, false);
project.SendWarningToLog("Остаток на warehouse_2 = " + warehouse_2, false);
 
  • Thank you
Reactions: Sanekk

udder

Client
Joined
Mar 28, 2017
Messages
633
Reaction score
138
Points
43
Интересует сниппет, который возьмет случайную строку с вхождением одного из слов, регистр не учитывать
например есть список со словами
Дыня
Арбзуз полосатый
Яблоко зеленое
Слива
Фрукты спелые
Овощи

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

ZSharp

Client
Joined
Sep 29, 2013
Messages
399
Reaction score
128
Points
43
Интересует сниппет, который возьмет случайную строку с вхождением одного из слов, регистр не учитывать
например есть список со словами
Дыня
Арбзуз полосатый
Яблоко зеленое
Слива
Фрукты спелые
Овощи

нужно взять строки, в которых есть слово слива или арбуз, случайным образом из всего списка.
C#:
var results = project.Lists["зеннолист"]
    .Where(x => !string.IsNullOrWhiteSpace(x))
    .Where(x => x.ToLowerInvariant().Contains("слива") ||
                         x.ToLowerInvariant().Contains("арбуз"))
    .OrderBy(x => Guid.NewGuid())
    .ToList();

foreach (var result in results)
{
    project.SendInfoToLog(result, true);
}
 
  • Thank you
Reactions: udder

ikibostus

Client
Joined
Sep 27, 2015
Messages
271
Reaction score
30
Points
28
Приветствую! Интересует сниппет, который поднимет асинхронный поток и в течение 5 минут будет проверять глобальную переменную. Если за 5 минут глабалка не увеличится, то прервать все потоки и по-новой запустить шаблон.
 

udder

Client
Joined
Mar 28, 2017
Messages
633
Reaction score
138
Points
43
C#:
var results = project.Lists["зеннолист"]
    .Where(x => !string.IsNullOrWhiteSpace(x))
    .Where(x => x.ToLowerInvariant().Contains("слива") ||
                         x.ToLowerInvariant().Contains("арбуз"))
    .OrderBy(x => Guid.NewGuid())
    .ToList();

foreach (var result in results)
{
    project.SendInfoToLog(result, true);
}
Спасибою но как как получить результат в перменную, а не в лог?
Если у экшена C# указать переменную "Положить результат в переменную" то ответ OK
 

ikibostus

Client
Joined
Sep 27, 2015
Messages
271
Reaction score
30
Points
28
Спасибою но как как получить результат в перменную, а не в лог?
Если у экшена C# указать переменную "Положить результат в переменную" то ответ OK
Замени эту строку
project.SendInfoToLog(result, true);
на project.Variables["peremennaya"].Value = result;
Предварительно создай переменную "peremennaya".
 
  • Thank you
Reactions: udder

ZSharp

Client
Joined
Sep 29, 2013
Messages
399
Reaction score
128
Points
43
Спасибою но как как получить результат в перменную, а не в лог?
Если у экшена C# указать переменную "Положить результат в переменную" то ответ OK
выше уже показали, но хочу уточнить, там подразумевается не один результат, а "строки".

Если нужен только один случайный, то можно сделать вот так
C#:
project.Variables["peremennaya"].Value = project.Lists["зеннолист"]
    .Where(x => !string.IsNullOrWhiteSpace(x))
    .Where(x => x.ToLowerInvariant().Contains("слива") ||
                x.ToLowerInvariant().Contains("арбуз"))
    .OrderBy(x => Guid.NewGuid())
    .FirstOrDefault();
 
  • Thank you
Reactions: udder

baracuda

Client
Joined
Jun 19, 2013
Messages
856
Reaction score
294
Points
63
Господа есть таблица. полу заполненная 500 строк. 15 колонок.
По 8 колонке хочу взять все пустые значения. и выбрать одно, положив в переменную.
Помогите исправить код... немогу понять что тут не так.

C#:
var table1 = project.Tables["аккаунты"];
int columnIndex = 7;

Random random = new Random();
var emptyRows = new List<int>();

for (int i = 0; i < table1.RowCount; i++)
{
    var rowData = table1.GetRow(i);
    var rowDataArray = rowData.Split(new char[] { ';' });

    
    if (string.IsNullOrEmpty(rowDataArray[columnIndex]))
    {
        emptyRows.Add(i);
    }
}

if (emptyRows.Count > 0)
{
    
    int randomRowIndex = emptyRows[random.Next(0, emptyRows.Count)];
        var emptyRow = table1.GetRow(randomRowIndex);
        project.SendInfoToLog(emptyRow);
}
else
{
    project.SendInfoToLog("нет нехрена");
}
 

BAZAg

Client
Joined
Nov 8, 2015
Messages
1,885
Reaction score
2,606
Points
113
Господа есть таблица. полу заполненная 500 строк. 15 колонок.
По 8 колонке хочу взять все пустые значения. и выбрать одно, положив в переменную.
Помогите исправить код... немогу понять что тут не так.

C#:
var table1 = project.Tables["аккаунты"];
int columnIndex = 7;

Random random = new Random();
var emptyRows = new List<int>();

for (int i = 0; i < table1.RowCount; i++)
{
    var rowData = table1.GetRow(i);
    var rowDataArray = rowData.Split(new char[] { ';' });

   
    if (string.IsNullOrEmpty(rowDataArray[columnIndex]))
    {
        emptyRows.Add(i);
    }
}

if (emptyRows.Count > 0)
{
   
    int randomRowIndex = emptyRows[random.Next(0, emptyRows.Count)];
        var emptyRow = table1.GetRow(randomRowIndex);
        project.SendInfoToLog(emptyRow);
}
else
{
    project.SendInfoToLog("нет нехрена");
}
Могу ошибаться, но может быть такое, что rowDataArray[columnIndex] не существует.
Я проверил бы ещё длину массива rowDataArray, чтобы убедиться в этом (если не существует, значит эта последняя ячейка точно пуста).
 
  • Thank you
Reactions: baracuda

baracuda

Client
Joined
Jun 19, 2013
Messages
856
Reaction score
294
Points
63
Могу ошибаться, но может быть такое, что rowDataArray[columnIndex] не существует.
Я проверил бы ещё длину массива rowDataArray, чтобы убедиться в этом (если не существует, значит эта последняя ячейка точно пуста).
Всё верно в таблице ";;;;;;;;;;;;;;;;;;;;;;" нет пустых значений в ячейках как оказалось. это не пустые значения... точнее тут в 8 колонке как бы есть значение, а в 11 нету. парадокс и в 3 нету, а в 4 есть
 

BAZAg

Client
Joined
Nov 8, 2015
Messages
1,885
Reaction score
2,606
Points
113
Всё верно в таблице ";;;;;;;;;;;;;;;;;;;;;;" нет пустых значений в ячейках как оказалось. это не пустые значения... точнее тут в 8 колонке как бы есть значение, а в 11 нету. парадокс и в 3 нету, а в 4 есть
Ещё раз посмотрел код.
Вот берем мы строчку с таблички.
В rowData у нас попадает не текст, а массив.
var rowData = table1.GetRow(i).ToArray();

Дальше почему-то мы МАССИВ разбиваем по разделителю...
А должны наверно разбивать строку...

var rowDataArray = rowData.Split(new char[] { ';' });

По всей логике должно было бы быть наверно так:

var rowDataArray = table1.GetRow(i).ToArray();
if (string.IsNullOrEmpty(rowDataArray[columnIndex])) emptyRows.Add(i);

Другими словами, разбивать по ";" необходимости нет.

Или я что-то не правильно понимаю задачу...
 

Veromilja

Client
Joined
Oct 17, 2016
Messages
6
Reaction score
1
Points
3
Нужен такой снипет, чтобы после каждого слова ставилась запятая, убирались слова менее 3 символов, и убирались все символы, к примеру:

БЫЛО

Путешествия вокруг света: от Восточной Европы до Центральной Азии

СТАЛО

Путешествия, вокруг, света, Восточной, Европы, Центральной, Азии
 

doc

Client
Joined
Mar 30, 2012
Messages
8,685
Reaction score
4,650
Points
113
Нужен такой снипет, чтобы после каждого слова ставилась запятая, убирались слова менее 3 символов, и убирались все символы, к примеру:

БЫЛО

Путешествия вокруг света: от Восточной Европы до Центральной Азии

СТАЛО

Путешествия, вокруг, света, Восточной, Европы, Центральной, Азии
C#:
string input_str = project.Variables["input_str"].Value;
var words = Regex.Matches(input_str, @"[^\W_\d]+")
    .Cast<Match>()
    .Select(x => x.Value)
    .Where(x => x.Length >= 3);

return string.Join(", ", words);
 
  • Thank you
Reactions: Veromilja

Manless

Client
Joined
Jan 9, 2014
Messages
186
Reaction score
33
Points
28
Ребят. Туплю никак не разберусь с вводом данных в C#.
Как проверить переменную, что она пустая, и если да, то присвоить значение 0 ей?
Данный код не работает


C#:
var tov_Cofe = double.Parse(project.Variables["tov_Cofe"].Value);
if (tov_Cofe == "" )
    {
        tov_Cofe=0;
        project.Variables["tov_Cofe"].Value = tov_Cofe.ToString();
    }
 

Alexmd

Client
Joined
Dec 10, 2018
Messages
1,021
Reaction score
1,427
Points
113
C#:
project.Variables["tov_Cofe"].Value = double.TryParse(project.Variables["tov_Cofe"].Value.Replace(".", ","), out double d) ? d.ToString() : "0";
 
  • Thank you
Reactions: Manless

Manless

Client
Joined
Jan 9, 2014
Messages
186
Reaction score
33
Points
28
C#:
project.Variables["tov_Cofe"].Value = double.TryParse(project.Variables["tov_Cofe"].Value.Replace(".", ","), out double d) ? d.ToString() : "0";
Спасибо!
1) Это я так понимаю получаем десятичное и на всякий случай приводим к нужному виду, если вдруг точка, а не запятая.
C#:
double.TryParse(project.Variables["tov_Cofe"].Value.Replace(".", ",")
а остальная часть как работает?))
 

udder

Client
Joined
Mar 28, 2017
Messages
633
Reaction score
138
Points
43
Данный C# код чистит текст, который берет из файла, путь к которому задаем в переменной url_filepath, а как адаптировать код, чтобы текст не из файла задавать, а из переменной?
C#:
string path = project.Variables["url_filepath"].Value;
string content = File.ReadAllText(path, Encoding.UTF8);

if (String.IsNullOrEmpty(content)) {
    return "";
}

// remove links from text
string remove_links = project.Variables["IN_remove_links"].Value;
if (!String.IsNullOrEmpty(remove_links) && (remove_links != "0")) { 
    content = Regex.Replace(content, @"((www\.|(http|https|ftp|news|file)+\:\/\/)[&#95_;.a-z0-9-]+\.[a-z0-9\/&#95_;:@=.+?,##%&~-]*[^.|\'|\# |!|\(|?|,| |>|<|;|\)])", "", RegexOptions.IgnoreCase);
    content = Regex.Replace(content, @"(?:[-a-z0-9@:%_\+~.#=]{2,256}\.)?([-a-z0-9@:%_\+~#=]*)\.[a-z]{2,6}\b(?:[-a-z0-9@:%_\+.~#?&\/\/=]*)", "", RegexOptions.IgnoreCase);

    // https://data.iana.org/TLD/tlds-alpha-by-domain.txt
    // Version 2020030500, Last Updated Thu Mar  5 07:07:01 2020 UTC
    content = Regex.Replace(content, @"[a-z0-9\-\._@:%\+~#=]+\.(AAA|AARP|ABARTH|ABB|ABBOTT|ABBVIE|ABC|ABLE|ABOGADO|ABUDHABI|AC|ACADEMY|ACCENTURE|ACCOUNTANT|ACCOUNTANTS|ACO|ACTOR|AD|ADAC|ADS|ADULT|AE|AEG|AERO|AETNA|AF|AFAMILYCOMPANY|AFL|AFRICA|AG|AGAKHAN|AGENCY|AI|AIG|AIGO|AIRBUS|AIRFORCE|AIRTEL|AKDN|AL|ALFAROMEO|ALIBABA|ALIPAY|ALLFINANZ|ALLSTATE|ALLY|ALSACE|ALSTOM|AM|AMERICANEXPRESS|AMERICANFAMILY|AMEX|AMFAM|AMICA|AMSTERDAM|ANALYTICS|ANDROID|ANQUAN|ANZ|AO|AOL|APARTMENTS|APP|APPLE|AQ|AQUARELLE|AR|ARAB|ARAMCO|ARCHI|ARMY|ARPA|ART|ARTE|AS|ASDA|ASIA|ASSOCIATES|AT|ATHLETA|ATTORNEY|AU|AUCTION|AUDI|AUDIBLE|AUDIO|AUSPOST|AUTHOR|AUTO|AUTOS|AVIANCA|AW|AWS|AX|AXA|AZ|AZURE|BA|BABY|BAIDU|BANAMEX|BANANAREPUBLIC|BAND|BANK|BAR|BARCELONA|BARCLAYCARD|BARCLAYS|BAREFOOT|BARGAINS|BASEBALL|BASKETBALL|BAUHAUS|BAYERN|BB|BBC|BBT|BBVA|BCG|BCN|BD|BE|BEATS|BEAUTY|BEER|BENTLEY|BERLIN|BEST|BESTBUY|BET|BF|BG|BH|BHARTI|BI|BIBLE|BID|BIKE|BING|BINGO|BIO|BIZ|BJ|BLACK|BLACKFRIDAY|BLOCKBUSTER|BLOG|BLOOMBERG|BLUE|BM|BMS|BMW|BN|BNPPARIBAS|BO|BOATS|BOEHRINGER|BOFA|BOM|BOND|BOO|BOOK|BOOKING|BOSCH|BOSTIK|BOSTON|BOT|BOUTIQUE|BOX|BR|BRADESCO|BRIDGESTONE|BROADWAY|BROKER|BROTHER|BRUSSELS|BS|BT|BUDAPEST|BUGATTI|BUILD|BUILDERS|BUSINESS|BUY|BUZZ|BV|BW|BY|BZ|BZH|CA|CAB|CAFE|CAL|CALL|CALVINKLEIN|CAM|CAMERA|CAMP|CANCERRESEARCH|CANON|CAPETOWN|CAPITAL|CAPITALONE|CAR|CARAVAN|CARDS|CARE|CAREER|CAREERS|CARS|CASA|CASE|CASEIH|CASH|CASINO|CAT|CATERING|CATHOLIC|CBA|CBN|CBRE|CBS|CC|CD|CEB|CENTER|CEO|CERN|CF|CFA|CFD|CG|CH|CHANEL|CHANNEL|CHARITY|CHASE|CHAT|CHEAP|CHINTAI|CHRISTMAS|CHROME|CHURCH|CI|CIPRIANI|CIRCLE|CISCO|CITADEL|CITI|CITIC|CITY|CITYEATS|CK|CL|CLAIMS|CLEANING|CLICK|CLINIC|CLINIQUE|CLOTHING|CLOUD|CLUB|CLUBMED|CM|CN|CO|COACH|CODES|COFFEE|COLLEGE|COLOGNE|COM|COMCAST|COMMBANK|COMMUNITY|COMPANY|COMPARE|COMPUTER|COMSEC|CONDOS|CONSTRUCTION|CONSULTING|CONTACT|CONTRACTORS|COOKING|COOKINGCHANNEL|COOL|COOP|CORSICA|COUNTRY|COUPON|COUPONS|COURSES|CPA|CR|CREDIT|CREDITCARD|CREDITUNION|CRICKET|CROWN|CRS|CRUISE|CRUISES|CSC|CU|CUISINELLA|CV|CW|CX|CY|CYMRU|CYOU|CZ|DABUR|DAD|DANCE|DATA|DATE|DATING|DATSUN|DAY|DCLK|DDS|DE|DEAL|DEALER|DEALS|DEGREE|DELIVERY|DELL|DELOITTE|DELTA|DEMOCRAT|DENTAL|DENTIST|DESI|DESIGN|DEV|DHL|DIAMONDS|DIET|DIGITAL|DIRECT|DIRECTORY|DISCOUNT|DISCOVER|DISH|DIY|DJ|DK|DM|DNP|DO|DOCS|DOCTOR|DOG|DOMAINS|DOT|DOWNLOAD|DRIVE|DTV|DUBAI|DUCK|DUNLOP|DUPONT|DURBAN|DVAG|DVR|DZ|EARTH|EAT|EC|ECO|EDEKA|EDU|EDUCATION|EE|EG|EMAIL|EMERCK|ENERGY|ENGINEER|ENGINEERING|ENTERPRISES|EPSON|EQUIPMENT|ER|ERICSSON|ERNI|ES|ESQ|ESTATE|ESURANCE|ET|ETISALAT|EU|EUROVISION|EUS|EVENTS|EXCHANGE|EXPERT|EXPOSED|EXPRESS|EXTRASPACE|FAGE|FAIL|FAIRWINDS|FAITH|FAMILY|FAN|FANS|FARM|FARMERS|FASHION|FAST|FEDEX|FEEDBACK|FERRARI|FERRERO|FI|FIAT|FIDELITY|FIDO|FILM|FINAL|FINANCE|FINANCIAL|FIRE|FIRESTONE|FIRMDALE|FISH|FISHING|FIT|FITNESS|FJ|FK|FLICKR|FLIGHTS|FLIR|FLORIST|FLOWERS|FLY|FM|FO|FOO|FOOD|FOODNETWORK|FOOTBALL|FORD|FOREX|FORSALE|FORUM|FOUNDATION|FOX|FR|FREE|FRESENIUS|FRL|FROGANS|FRONTDOOR|FRONTIER|FTR|FUJITSU|FUJIXEROX|FUN|FUND|FURNITURE|FUTBOL|FYI|GA|GAL|GALLERY|GALLO|GALLUP|GAME|GAMES|GAP|GARDEN|GAY|GB|GBIZ|GD|GDN|GE|GEA|GENT|GENTING|GEORGE|GF|GG|GGEE|GH|GI|GIFT|GIFTS|GIVES|GIVING|GL|GLADE|GLASS|GLE|GLOBAL|GLOBO|GM|GMAIL|GMBH|GMO|GMX|GN|GODADDY|GOLD|GOLDPOINT|GOLF|GOO|GOODYEAR|GOOG|GOOGLE|GOP|GOT|GOV|GP|GQ|GR|GRAINGER|GRAPHICS|GRATIS|GREEN|GRIPE|GROCERY|GROUP|GS|GT|GU|GUARDIAN|GUCCI|GUGE|GUIDE|GUITARS|GURU|GW|GY|HAIR|HAMBURG|HANGOUT|HAUS|HBO|HDFC|HDFCBANK|HEALTH|HEALTHCARE|HELP|HELSINKI|HERE|HERMES|HGTV|HIPHOP|HISAMITSU|HITACHI|HIV|HK|HKT|HM|HN|HOCKEY|HOLDINGS|HOLIDAY|HOMEDEPOT|HOMEGOODS|HOMES|HOMESENSE|HONDA|HORSE|HOSPITAL|HOST|HOSTING|HOT|HOTELES|HOTELS|HOTMAIL|HOUSE|HOW|HR|HSBC|HT|HU|HUGHES|HYATT|HYUNDAI|IBM|ICBC|ICE|ICU|ID|IE|IEEE|IFM|IKANO|IL|IM|IMAMAT|IMDB|IMMO|IMMOBILIEN|IN|INC|INDUSTRIES|INFINITI|INFO|ING|INK|INSTITUTE|INSURANCE|INSURE|INT|INTEL|INTERNATIONAL|INTUIT|INVESTMENTS|IO|IPIRANGA|IQ|IR|IRISH|IS|ISMAILI|IST|ISTANBUL|IT|ITAU|ITV|IVECO|JAGUAR|JAVA|JCB|JCP|JE|JEEP|JETZT|JEWELRY|JIO|JLL|JM|JMP|JNJ|JO|JOBS|JOBURG|JOT|JOY|JP|JPMORGAN|JPRS|JUEGOS|JUNIPER|KAUFEN|KDDI|KE|KERRYHOTELS|KERRYLOGISTICS|KERRYPROPERTIES|KFH|KG|KH|KI|KIA|KIM|KINDER|KINDLE|KITCHEN|KIWI|KM|KN|KOELN|KOMATSU|KOSHER|KP|KPMG|KPN|KR|KRD|KRED|KUOKGROUP|KW|KY|KYOTO|KZ|LA|LACAIXA|LAMBORGHINI|LAMER|LANCASTER|LANCIA|LAND|LANDROVER|LANXESS|LASALLE|LAT|LATINO|LATROBE|LAW|LAWYER|LB|LC|LDS|LEASE|LECLERC|LEFRAK|LEGAL|LEGO|LEXUS|LGBT|LI|LIDL|LIFE|LIFEINSURANCE|LIFESTYLE|LIGHTING|LIKE|LILLY|LIMITED|LIMO|LINCOLN|LINDE|LINK|LIPSY|LIVE|LIVING|LIXIL|LK|LLC|LLP|LOAN|LOANS|LOCKER|LOCUS|LOFT|LOL|LONDON|LOTTE|LOTTO|LOVE|LPL|LPLFINANCIAL|LR|LS|LT|LTD|LTDA|LU|LUNDBECK|LUPIN|LUXE|LUXURY|LV|LY|MA|MACYS|MADRID|MAIF|MAISON|MAKEUP|MAN|MANAGEMENT|MANGO|MAP|MARKET|MARKETING|MARKETS|MARRIOTT|MARSHALLS|MASERATI|MATTEL|MBA|MC|MCKINSEY|MD|ME|MED|MEDIA|MEET|MELBOURNE|MEME|MEMORIAL|MEN|MENU|MERCKMSD|METLIFE|MG|MH|MIAMI|MICROSOFT|MIL|MINI|MINT|MIT|MITSUBISHI|MK|ML|MLB|MLS|MM|MMA|MN|MO|MOBI|MOBILE|MODA|MOE|MOI|MOM|MONASH|MONEY|MONSTER|MORMON|MORTGAGE|MOSCOW|MOTO|MOTORCYCLES|MOV|MOVIE|MP|MQ|MR|MS|MSD|MT|MTN|MTR|MU|MUSEUM|MUTUAL|MV|MW|MX|MY|MZ|NA|NAB|NADEX|NAGOYA|NAME|NATIONWIDE|NATURA|NAVY|NBA|NC|NE|NEC|NET|NETBANK|NETFLIX|NETWORK|NEUSTAR|NEW|NEWHOLLAND|NEWS|NEXT|NEXTDIRECT|NEXUS|NF|NFL|NG|NGO|NHK|NI|NICO|NIKE|NIKON|NINJA|NISSAN|NISSAY|NL|NO|NOKIA|NORTHWESTERNMUTUAL|NORTON|NOW|NOWRUZ|NOWTV|NP|NR|NRA|NRW|NTT|NU|NYC|NZ|OBI|OBSERVER|OFF|OFFICE|OKINAWA|OLAYAN|OLAYANGROUP|OLDNAVY|OLLO|OM|OMEGA|ONE|ONG|ONL|ONLINE|ONYOURSIDE|OOO|OPEN|ORACLE|ORANGE|ORG|ORGANIC|ORIGINS|OSAKA|OTSUKA|OTT|OVH|PA|PAGE|PANASONIC|PARIS|PARS|PARTNERS|PARTS|PARTY|PASSAGENS|PAY|PCCW|PE|PET|PF|PFIZER|PG|PH|PHARMACY|PHD|PHILIPS|PHONE|PHOTO|PHOTOGRAPHY|PHOTOS|PHYSIO|PICS|PICTET|PICTURES|PID|PIN|PING|PINK|PIONEER|PIZZA|PK|PL|PLACE|PLAY|PLAYSTATION|PLUMBING|PLUS|PM|PN|PNC|POHL|POKER|POLITIE|PORN|POST|PR|PRAMERICA|PRAXI|PRESS|PRIME|PRO|PROD|PRODUCTIONS|PROF|PROGRESSIVE|PROMO|PROPERTIES|PROPERTY|PROTECTION|PRU|PRUDENTIAL|PS|PT|PUB|PW|PWC|PY|QA|QPON|QUEBEC|QUEST|QVC|RACING|RADIO|RAID|RE|READ|REALESTATE|REALTOR|REALTY|RECIPES|RED|REDSTONE|REDUMBRELLA|REHAB|REISE|REISEN|REIT|RELIANCE|REN|RENT|RENTALS|REPAIR|REPORT|REPUBLICAN|REST|RESTAURANT|REVIEW|REVIEWS|REXROTH|RICH|RICHARDLI|RICOH|RIGHTATHOME|RIL|RIO|RIP|RMIT|RO|ROCHER|ROCKS|RODEO|ROGERS|ROOM|RS|RSVP|RU|RUGBY|RUHR|RUN|RW|RWE|RYUKYU|SA|SAARLAND|SAFE|SAFETY|SAKURA|SALE|SALON|SAMSCLUB|SAMSUNG|SANDVIK|SANDVIKCOROMANT|SANOFI|SAP|SARL|SAS|SAVE|SAXO|SB|SBI|SBS|SC|SCA|SCB|SCHAEFFLER|SCHMIDT|SCHOLARSHIPS|SCHOOL|SCHULE|SCHWARZ|SCIENCE|SCJOHNSON|SCOR|SCOT|SD|SE|SEARCH|SEAT|SECURE|SECURITY|SEEK|SELECT|SENER|SERVICES|SES|SEVEN|SEW|SEX|SEXY|SFR|SG|SH|SHANGRILA|SHARP|SHAW|SHELL|SHIA|SHIKSHA|SHOES|SHOP|SHOPPING|SHOUJI|SHOW|SHOWTIME|SHRIRAM|SI|SILK|SINA|SINGLES|SITE|SJ|SK|SKI|SKIN|SKY|SKYPE|SL|SLING|SM|SMART|SMILE|SN|SNCF|SO|SOCCER|SOCIAL|SOFTBANK|SOFTWARE|SOHU|SOLAR|SOLUTIONS|SONG|SONY|SOY|SPACE|SPORT|SPOT|SPREADBETTING|SR|SRL|SS|ST|STADA|STAPLES|STAR|STATEBANK|STATEFARM|STC|STCGROUP|STOCKHOLM|STORAGE|STORE|STREAM|STUDIO|STUDY|STYLE|SU|SUCKS|SUPPLIES|SUPPLY|SUPPORT|SURF|SURGERY|SUZUKI|SV|SWATCH|SWIFTCOVER|SWISS|SX|SY|SYDNEY|SYMANTEC|SYSTEMS|SZ|TAB|TAIPEI|TALK|TAOBAO|TARGET|TATAMOTORS|TATAR|TATTOO|TAX|TAXI|TC|TCI|TD|TDK|TEAM|TECH|TECHNOLOGY|TEL|TEMASEK|TENNIS|TEVA|TF|TG|TH|THD|THEATER|THEATRE|TIAA|TICKETS|TIENDA|TIFFANY|TIPS|TIRES|TIROL|TJ|TJMAXX|TJX|TK|TKMAXX|TL|TM|TMALL|TN|TO|TODAY|TOKYO|TOOLS|TOP|TORAY|TOSHIBA|TOTAL|TOURS|TOWN|TOYOTA|TOYS|TR|TRADE|TRADING|TRAINING|TRAVEL|TRAVELCHANNEL|TRAVELERS|TRAVELERSINSURANCE|TRUST|TRV|TT|TUBE|TUI|TUNES|TUSHU|TV|TVS|TW|TZ|UA|UBANK|UBS|UG|UK|UNICOM|UNIVERSITY|UNO|UOL|UPS|US|UY|UZ|VA|VACATIONS|VANA|VANGUARD|VC|VE|VEGAS|VENTURES|VERISIGN|VERSICHERUNG|VET|VG|VI|VIAJES|VIDEO|VIG|VIKING|VILLAS|VIN|VIP|VIRGIN|VISA|VISION|VISTAPRINT|VIVA|VIVO|VLAANDEREN|VN|VODKA|VOLKSWAGEN|VOLVO|VOTE|VOTING|VOTO|VOYAGE|VU|VUELOS|WALES|WALMART|WALTER|WANG|WANGGOU|WATCH|WATCHES|WEATHER|WEATHERCHANNEL|WEBCAM|WEBER|WEBSITE|WED|WEDDING|WEIBO|WEIR|WF|WHOSWHO|WIEN|WIKI|WILLIAMHILL|WIN|WINDOWS|WINE|WINNERS|WME|WOLTERSKLUWER|WOODSIDE|WORK|WORKS|WORLD|WOW|WS|WTC|WTF|XBOX|XEROX|XFINITY|XIHUAN|XIN|XN--11B4C3D|XN--1CK2E1B|XN--1QQW23A|XN--2SCRJ9C|XN--30RR7Y|XN--3BST00M|XN--3DS443G|XN--3E0B707E|XN--3HCRJ9C|XN--3OQ18VL8PN36A|XN--3PXU8K|XN--42C2D9A|XN--45BR5CYL|XN--45BRJ9C|XN--45Q11C|XN--4GBRIM|XN--54B7FTA0CC|XN--55QW42G|XN--55QX5D|XN--5SU34J936BGSG|XN--5TZM5G|XN--6FRZ82G|XN--6QQ986B3XL|XN--80ADXHKS|XN--80AO21A|XN--80AQECDR1A|XN--80ASEHDB|XN--80ASWG|XN--8Y0A063A|XN--90A3AC|XN--90AE|XN--90AIS|XN--9DBQ2A|XN--9ET52U|XN--9KRT00A|XN--B4W605FERD|XN--BCK1B9A5DRE4C|XN--C1AVG|XN--C2BR7G|XN--CCK2B3B|XN--CG4BKI|XN--CLCHC0EA0B2G2A9GCD|XN--CZR694B|XN--CZRS0T|XN--CZRU2D|XN--D1ACJ3B|XN--D1ALF|XN--E1A4C|XN--ECKVDTC9D|XN--EFVY88H|XN--ESTV75G|XN--FCT429K|XN--FHBEI|XN--FIQ228C5HS|XN--FIQ64B|XN--FIQS8S|XN--FIQZ9S|XN--FJQ720A|XN--FLW351E|XN--FPCRJ9C3D|XN--FZC2C9E2C|XN--FZYS8D69UVGM|XN--G2XX48C|XN--GCKR3F0F|XN--GECRJ9C|XN--GK3AT1E|XN--H2BREG3EVE|XN--H2BRJ9C|XN--H2BRJ9C8C|XN--HXT814E|XN--I1B6B1A6A2E|XN--IMR513N|XN--IO0A7I|XN--J1AEF|XN--J1AMH|XN--J6W193G|XN--JLQ61U9W7B|XN--JVR189M|XN--KCRX77D1X4A|XN--KPRW13D|XN--KPRY57D|XN--KPU716F|XN--KPUT3I|XN--L1ACC|XN--LGBBAT1AD8J|XN--MGB9AWBF|XN--MGBA3A3EJT|XN--MGBA3A4F16A|XN--MGBA7C0BBN0A|XN--MGBAAKC7DVF|XN--MGBAAM7A8H|XN--MGBAB2BD|XN--MGBAH1A3HJKRD|XN--MGBAI9AZGQP6J|XN--MGBAYH7GPA|XN--MGBBH1A|XN--MGBBH1A71E|XN--MGBC0A9AZCG|XN--MGBCA7DZDO|XN--MGBCPQ6GPA1A|XN--MGBERP4A5D4AR|XN--MGBGU82A|XN--MGBI4ECEXP|XN--MGBPL2FH|XN--MGBT3DHD|XN--MGBTX2B|XN--MGBX4CD0AB|XN--MIX891F|XN--MK1BU44C|XN--MXTQ1M|XN--NGBC5AZD|XN--NGBE9E0A|XN--NGBRX|XN--NODE|XN--NQV7F|XN--NQV7FS00EMA|XN--NYQY26A|XN--O3CW4H|XN--OGBPF8FL|XN--OTU796D|XN--P1ACF|XN--P1AI|XN--PBT977C|XN--PGBS0DH|XN--PSSY2U|XN--Q7CE6A|XN--Q9JYB4C|XN--QCKA1PMC|XN--QXA6A|XN--QXAM|XN--RHQV96G|XN--ROVU88B|XN--RVC1E0AM3E|XN--S9BRJ9C|XN--SES554G|XN--T60B56A|XN--TCKWE|XN--TIQ49XQYJ|XN--UNUP4Y|XN--VERMGENSBERATER-CTB|XN--VERMGENSBERATUNG-PWB|XN--VHQUV|XN--VUQ861B|XN--W4R85EL8FHU5DNRA|XN--W4RS40L|XN--WGBH1C|XN--WGBL6A|XN--XHQ521B|XN--XKC2AL3HYE2A|XN--XKC2DL3A5EE0H|XN--Y9A3AQ|XN--YFRO4I67O|XN--YGBI2AMMX|XN--ZFR164B|XXX|XYZ|YACHTS|YAHOO|YAMAXUN|YANDEX|YE|YODOBASHI|YOGA|YOKOHAMA|YOU|YOUTUBE|YT|YUN|ZA|ZAPPOS|ZARA|ZERO|ZIP|ZM|ZONE|ZUERICH|ZW)", "", RegexOptions.IgnoreCase);
    content = content.Replace("https", "").Replace("http", "").Replace("://", "").Replace("www.", "");
}


// fix spaces/tabs/newlines
string space_symbols = Convert.ToString((char)32) + Convert.ToString((char)160);
content = Regex.Replace(content, @"[\t]+", " ");
content = Regex.Replace(content, @"[" + space_symbols + @"]{2,}", " ");
content = Regex.Replace(content, @"([\n\r]+)[" + space_symbols + @"]+", "$1");
content = Regex.Replace(content, @"[" + space_symbols + @"]+([\n\r]+)", "$1");
content = Regex.Replace(content, @"[\n]{2,}", "\n");

// fix line endings to win style
content = content.Replace("\r", "\n");
content = Regex.Replace(content, @"[\n]{2,}", "\n");
content = content.Replace("\n", Environment.NewLine);

// fix spaces around some symbols
content = Regex.Replace(content, @"\s+([!%\),\.:;\?\]\}]+)", "$1");
content = Regex.Replace(content, @"([\.!,\?])([^\s\.!,\?]+)", "$1 $2");
// !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~

// remove duplicates #1
string[] content_lines = content.Split(new char[]{'\n'}, StringSplitOptions.RemoveEmptyEntries);
List<string> content_lines_lst = new List<string>();
foreach(string line in content_lines) {
    if (!content_lines_lst.Contains(line)) {
        content_lines_lst.Add(line);
    }
}
content = String.Join("\n", content_lines_lst);

// remove duplicates #2
content_lines_lst.Clear();
content_lines = content.Split(new string[]{". "}, StringSplitOptions.RemoveEmptyEntries);
foreach(string line in content_lines) {
    if (!content_lines_lst.Contains(line)) {
        content_lines_lst.Add(line);
    }
}
content = String.Join(". ", content_lines_lst);

content = content.Trim();


// binary data heuristic
/*
https://docs.microsoft.com/en-us/dotnet/standard/base-types/character-classes-in-regular-expressions#unicode-category-or-unicode-block-p
https://www.unicode.org/reports/tr44/
https://docs.microsoft.com/en-us/dotnet/standard/base-types/character-classes-in-regular-expressions#supported-named-blocks
*/
MatchCollection mc = Regex.Matches(content, @"[\p{P}\p{S}\p{C}]");
int count = 0;
string[] good_punct = {"!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", ":", ";", "<", "=", ">", "?", "@", "[", "\\", "]", "^", "_", "`", "{", "|", "}", "~", "\n", "\r", "\t", Convert.ToString((char)32), Convert.ToString((char)160)};
foreach(Match m in mc) {
    if (!good_punct.Contains(m.Value)) {
        count++;
    }
}

double max_percent = (content.Length / 100.0) * 15;
if (count > max_percent) {
    content = "";
}

// digits heuristic
mc = Regex.Matches(content, @"[0-9]");
max_percent = (content.Length / 100.0) * 75;
if (mc.Count > max_percent) {
    content = "";
}



// save result
File.WriteAllText(path, content, Encoding.UTF8);


// save meta info
Dictionary<string, string> data = new Dictionary<string, string>() {
    {"url", project.Variables["IN_url"].Value},
    // можно добавить свои мета данные (как в примере строчкой выше)
};
List<string> data_lines = new List<string>();
foreach(KeyValuePair<string, string> kv in data) {
    data_lines.Add(
        String.Format("<{0}>{1}</{0}>", kv.Key, kv.Value)
    );
}
string data_content = String.Join(Environment.NewLine, data_lines);
path = path.Replace(".txt", ".meta.txt");
File.WriteAllText(path, data_content, Encoding.UTF8);


// return result content
return content;
РЕШЕНИЕ:
string content = project.Variables["OUT_text"].Value;

if (String.IsNullOrEmpty(content)) {
    return "";
}

// remove links from text
string remove_links = project.Variables["IN_remove_links"].Value;
if (!String.IsNullOrEmpty(remove_links) && (remove_links != "0")) {  
    content = Regex.Replace(content, @"((www\.|(http|https|ftp|news|file)+\:\/\/)[&#95_;.a-z0-9-]+\.[a-z0-9\/&#95_;:@=.+?,##%&~-]*[^.|\'|\# |!|\(|?|,| |>|<|;|\)])", "", RegexOptions.IgnoreCase);
    content = Regex.Replace(content, @"(?:[-a-z0-9@:%_\+~.#=]{2,256}\.)?([-a-z0-9@:%_\+~#=]*)\.[a-z]{2,6}\b(?:[-a-z0-9@:%_\+.~#?&\/\/=]*)", "", RegexOptions.IgnoreCase);

    // https://data.iana.org/TLD/tlds-alpha-by-domain.txt
    // Version 2020030500, Last Updated Thu Mar  5 07:07:01 2020 UTC
    content = Regex.Replace(content, @"[a-z0-9\-\._@:%\+~#=]+\.(AAA|AARP|ABARTH|ABB|ABBOTT|ABBVIE|ABC|ABLE|ABOGADO|ABUDHABI|AC|ACADEMY|ACCENTURE|ACCOUNTANT|ACCOUNTANTS|ACO|ACTOR|AD|ADAC|ADS|ADULT|AE|AEG|AERO|AETNA|AF|AFAMILYCOMPANY|AFL|AFRICA|AG|AGAKHAN|AGENCY|AI|AIG|AIGO|AIRBUS|AIRFORCE|AIRTEL|AKDN|AL|ALFAROMEO|ALIBABA|ALIPAY|ALLFINANZ|ALLSTATE|ALLY|ALSACE|ALSTOM|AM|AMERICANEXPRESS|AMERICANFAMILY|AMEX|AMFAM|AMICA|AMSTERDAM|ANALYTICS|ANDROID|ANQUAN|ANZ|AO|AOL|APARTMENTS|APP|APPLE|AQ|AQUARELLE|AR|ARAB|ARAMCO|ARCHI|ARMY|ARPA|ART|ARTE|AS|ASDA|ASIA|ASSOCIATES|AT|ATHLETA|ATTORNEY|AU|AUCTION|AUDI|AUDIBLE|AUDIO|AUSPOST|AUTHOR|AUTO|AUTOS|AVIANCA|AW|AWS|AX|AXA|AZ|AZURE|BA|BABY|BAIDU|BANAMEX|BANANAREPUBLIC|BAND|BANK|BAR|BARCELONA|BARCLAYCARD|BARCLAYS|BAREFOOT|BARGAINS|BASEBALL|BASKETBALL|BAUHAUS|BAYERN|BB|BBC|BBT|BBVA|BCG|BCN|BD|BE|BEATS|BEAUTY|BEER|BENTLEY|BERLIN|BEST|BESTBUY|BET|BF|BG|BH|BHARTI|BI|BIBLE|BID|BIKE|BING|BINGO|BIO|BIZ|BJ|BLACK|BLACKFRIDAY|BLOCKBUSTER|BLOG|BLOOMBERG|BLUE|BM|BMS|BMW|BN|BNPPARIBAS|BO|BOATS|BOEHRINGER|BOFA|BOM|BOND|BOO|BOOK|BOOKING|BOSCH|BOSTIK|BOSTON|BOT|BOUTIQUE|BOX|BR|BRADESCO|BRIDGESTONE|BROADWAY|BROKER|BROTHER|BRUSSELS|BS|BT|BUDAPEST|BUGATTI|BUILD|BUILDERS|BUSINESS|BUY|BUZZ|BV|BW|BY|BZ|BZH|CA|CAB|CAFE|CAL|CALL|CALVINKLEIN|CAM|CAMERA|CAMP|CANCERRESEARCH|CANON|CAPETOWN|CAPITAL|CAPITALONE|CAR|CARAVAN|CARDS|CARE|CAREER|CAREERS|CARS|CASA|CASE|CASEIH|CASH|CASINO|CAT|CATERING|CATHOLIC|CBA|CBN|CBRE|CBS|CC|CD|CEB|CENTER|CEO|CERN|CF|CFA|CFD|CG|CH|CHANEL|CHANNEL|CHARITY|CHASE|CHAT|CHEAP|CHINTAI|CHRISTMAS|CHROME|CHURCH|CI|CIPRIANI|CIRCLE|CISCO|CITADEL|CITI|CITIC|CITY|CITYEATS|CK|CL|CLAIMS|CLEANING|CLICK|CLINIC|CLINIQUE|CLOTHING|CLOUD|CLUB|CLUBMED|CM|CN|CO|COACH|CODES|COFFEE|COLLEGE|COLOGNE|COM|COMCAST|COMMBANK|COMMUNITY|COMPANY|COMPARE|COMPUTER|COMSEC|CONDOS|CONSTRUCTION|CONSULTING|CONTACT|CONTRACTORS|COOKING|COOKINGCHANNEL|COOL|COOP|CORSICA|COUNTRY|COUPON|COUPONS|COURSES|CPA|CR|CREDIT|CREDITCARD|CREDITUNION|CRICKET|CROWN|CRS|CRUISE|CRUISES|CSC|CU|CUISINELLA|CV|CW|CX|CY|CYMRU|CYOU|CZ|DABUR|DAD|DANCE|DATA|DATE|DATING|DATSUN|DAY|DCLK|DDS|DE|DEAL|DEALER|DEALS|DEGREE|DELIVERY|DELL|DELOITTE|DELTA|DEMOCRAT|DENTAL|DENTIST|DESI|DESIGN|DEV|DHL|DIAMONDS|DIET|DIGITAL|DIRECT|DIRECTORY|DISCOUNT|DISCOVER|DISH|DIY|DJ|DK|DM|DNP|DO|DOCS|DOCTOR|DOG|DOMAINS|DOT|DOWNLOAD|DRIVE|DTV|DUBAI|DUCK|DUNLOP|DUPONT|DURBAN|DVAG|DVR|DZ|EARTH|EAT|EC|ECO|EDEKA|EDU|EDUCATION|EE|EG|EMAIL|EMERCK|ENERGY|ENGINEER|ENGINEERING|ENTERPRISES|EPSON|EQUIPMENT|ER|ERICSSON|ERNI|ES|ESQ|ESTATE|ESURANCE|ET|ETISALAT|EU|EUROVISION|EUS|EVENTS|EXCHANGE|EXPERT|EXPOSED|EXPRESS|EXTRASPACE|FAGE|FAIL|FAIRWINDS|FAITH|FAMILY|FAN|FANS|FARM|FARMERS|FASHION|FAST|FEDEX|FEEDBACK|FERRARI|FERRERO|FI|FIAT|FIDELITY|FIDO|FILM|FINAL|FINANCE|FINANCIAL|FIRE|FIRESTONE|FIRMDALE|FISH|FISHING|FIT|FITNESS|FJ|FK|FLICKR|FLIGHTS|FLIR|FLORIST|FLOWERS|FLY|FM|FO|FOO|FOOD|FOODNETWORK|FOOTBALL|FORD|FOREX|FORSALE|FORUM|FOUNDATION|FOX|FR|FREE|FRESENIUS|FRL|FROGANS|FRONTDOOR|FRONTIER|FTR|FUJITSU|FUJIXEROX|FUN|FUND|FURNITURE|FUTBOL|FYI|GA|GAL|GALLERY|GALLO|GALLUP|GAME|GAMES|GAP|GARDEN|GAY|GB|GBIZ|GD|GDN|GE|GEA|GENT|GENTING|GEORGE|GF|GG|GGEE|GH|GI|GIFT|GIFTS|GIVES|GIVING|GL|GLADE|GLASS|GLE|GLOBAL|GLOBO|GM|GMAIL|GMBH|GMO|GMX|GN|GODADDY|GOLD|GOLDPOINT|GOLF|GOO|GOODYEAR|GOOG|GOOGLE|GOP|GOT|GOV|GP|GQ|GR|GRAINGER|GRAPHICS|GRATIS|GREEN|GRIPE|GROCERY|GROUP|GS|GT|GU|GUARDIAN|GUCCI|GUGE|GUIDE|GUITARS|GURU|GW|GY|HAIR|HAMBURG|HANGOUT|HAUS|HBO|HDFC|HDFCBANK|HEALTH|HEALTHCARE|HELP|HELSINKI|HERE|HERMES|HGTV|HIPHOP|HISAMITSU|HITACHI|HIV|HK|HKT|HM|HN|HOCKEY|HOLDINGS|HOLIDAY|HOMEDEPOT|HOMEGOODS|HOMES|HOMESENSE|HONDA|HORSE|HOSPITAL|HOST|HOSTING|HOT|HOTELES|HOTELS|HOTMAIL|HOUSE|HOW|HR|HSBC|HT|HU|HUGHES|HYATT|HYUNDAI|IBM|ICBC|ICE|ICU|ID|IE|IEEE|IFM|IKANO|IL|IM|IMAMAT|IMDB|IMMO|IMMOBILIEN|IN|INC|INDUSTRIES|INFINITI|INFO|ING|INK|INSTITUTE|INSURANCE|INSURE|INT|INTEL|INTERNATIONAL|INTUIT|INVESTMENTS|IO|IPIRANGA|IQ|IR|IRISH|IS|ISMAILI|IST|ISTANBUL|IT|ITAU|ITV|IVECO|JAGUAR|JAVA|JCB|JCP|JE|JEEP|JETZT|JEWELRY|JIO|JLL|JM|JMP|JNJ|JO|JOBS|JOBURG|JOT|JOY|JP|JPMORGAN|JPRS|JUEGOS|JUNIPER|KAUFEN|KDDI|KE|KERRYHOTELS|KERRYLOGISTICS|KERRYPROPERTIES|KFH|KG|KH|KI|KIA|KIM|KINDER|KINDLE|KITCHEN|KIWI|KM|KN|KOELN|KOMATSU|KOSHER|KP|KPMG|KPN|KR|KRD|KRED|KUOKGROUP|KW|KY|KYOTO|KZ|LA|LACAIXA|LAMBORGHINI|LAMER|LANCASTER|LANCIA|LAND|LANDROVER|LANXESS|LASALLE|LAT|LATINO|LATROBE|LAW|LAWYER|LB|LC|LDS|LEASE|LECLERC|LEFRAK|LEGAL|LEGO|LEXUS|LGBT|LI|LIDL|LIFE|LIFEINSURANCE|LIFESTYLE|LIGHTING|LIKE|LILLY|LIMITED|LIMO|LINCOLN|LINDE|LINK|LIPSY|LIVE|LIVING|LIXIL|LK|LLC|LLP|LOAN|LOANS|LOCKER|LOCUS|LOFT|LOL|LONDON|LOTTE|LOTTO|LOVE|LPL|LPLFINANCIAL|LR|LS|LT|LTD|LTDA|LU|LUNDBECK|LUPIN|LUXE|LUXURY|LV|LY|MA|MACYS|MADRID|MAIF|MAISON|MAKEUP|MAN|MANAGEMENT|MANGO|MAP|MARKET|MARKETING|MARKETS|MARRIOTT|MARSHALLS|MASERATI|MATTEL|MBA|MC|MCKINSEY|MD|ME|MED|MEDIA|MEET|MELBOURNE|MEME|MEMORIAL|MEN|MENU|MERCKMSD|METLIFE|MG|MH|MIAMI|MICROSOFT|MIL|MINI|MINT|MIT|MITSUBISHI|MK|ML|MLB|MLS|MM|MMA|MN|MO|MOBI|MOBILE|MODA|MOE|MOI|MOM|MONASH|MONEY|MONSTER|MORMON|MORTGAGE|MOSCOW|MOTO|MOTORCYCLES|MOV|MOVIE|MP|MQ|MR|MS|MSD|MT|MTN|MTR|MU|MUSEUM|MUTUAL|MV|MW|MX|MY|MZ|NA|NAB|NADEX|NAGOYA|NAME|NATIONWIDE|NATURA|NAVY|NBA|NC|NE|NEC|NET|NETBANK|NETFLIX|NETWORK|NEUSTAR|NEW|NEWHOLLAND|NEWS|NEXT|NEXTDIRECT|NEXUS|NF|NFL|NG|NGO|NHK|NI|NICO|NIKE|NIKON|NINJA|NISSAN|NISSAY|NL|NO|NOKIA|NORTHWESTERNMUTUAL|NORTON|NOW|NOWRUZ|NOWTV|NP|NR|NRA|NRW|NTT|NU|NYC|NZ|OBI|OBSERVER|OFF|OFFICE|OKINAWA|OLAYAN|OLAYANGROUP|OLDNAVY|OLLO|OM|OMEGA|ONE|ONG|ONL|ONLINE|ONYOURSIDE|OOO|OPEN|ORACLE|ORANGE|ORG|ORGANIC|ORIGINS|OSAKA|OTSUKA|OTT|OVH|PA|PAGE|PANASONIC|PARIS|PARS|PARTNERS|PARTS|PARTY|PASSAGENS|PAY|PCCW|PE|PET|PF|PFIZER|PG|PH|PHARMACY|PHD|PHILIPS|PHONE|PHOTO|PHOTOGRAPHY|PHOTOS|PHYSIO|PICS|PICTET|PICTURES|PID|PIN|PING|PINK|PIONEER|PIZZA|PK|PL|PLACE|PLAY|PLAYSTATION|PLUMBING|PLUS|PM|PN|PNC|POHL|POKER|POLITIE|PORN|POST|PR|PRAMERICA|PRAXI|PRESS|PRIME|PRO|PROD|PRODUCTIONS|PROF|PROGRESSIVE|PROMO|PROPERTIES|PROPERTY|PROTECTION|PRU|PRUDENTIAL|PS|PT|PUB|PW|PWC|PY|QA|QPON|QUEBEC|QUEST|QVC|RACING|RADIO|RAID|RE|READ|REALESTATE|REALTOR|REALTY|RECIPES|RED|REDSTONE|REDUMBRELLA|REHAB|REISE|REISEN|REIT|RELIANCE|REN|RENT|RENTALS|REPAIR|REPORT|REPUBLICAN|REST|RESTAURANT|REVIEW|REVIEWS|REXROTH|RICH|RICHARDLI|RICOH|RIGHTATHOME|RIL|RIO|RIP|RMIT|RO|ROCHER|ROCKS|RODEO|ROGERS|ROOM|RS|RSVP|RU|RUGBY|RUHR|RUN|RW|RWE|RYUKYU|SA|SAARLAND|SAFE|SAFETY|SAKURA|SALE|SALON|SAMSCLUB|SAMSUNG|SANDVIK|SANDVIKCOROMANT|SANOFI|SAP|SARL|SAS|SAVE|SAXO|SB|SBI|SBS|SC|SCA|SCB|SCHAEFFLER|SCHMIDT|SCHOLARSHIPS|SCHOOL|SCHULE|SCHWARZ|SCIENCE|SCJOHNSON|SCOR|SCOT|SD|SE|SEARCH|SEAT|SECURE|SECURITY|SEEK|SELECT|SENER|SERVICES|SES|SEVEN|SEW|SEX|SEXY|SFR|SG|SH|SHANGRILA|SHARP|SHAW|SHELL|SHIA|SHIKSHA|SHOES|SHOP|SHOPPING|SHOUJI|SHOW|SHOWTIME|SHRIRAM|SI|SILK|SINA|SINGLES|SITE|SJ|SK|SKI|SKIN|SKY|SKYPE|SL|SLING|SM|SMART|SMILE|SN|SNCF|SO|SOCCER|SOCIAL|SOFTBANK|SOFTWARE|SOHU|SOLAR|SOLUTIONS|SONG|SONY|SOY|SPACE|SPORT|SPOT|SPREADBETTING|SR|SRL|SS|ST|STADA|STAPLES|STAR|STATEBANK|STATEFARM|STC|STCGROUP|STOCKHOLM|STORAGE|STORE|STREAM|STUDIO|STUDY|STYLE|SU|SUCKS|SUPPLIES|SUPPLY|SUPPORT|SURF|SURGERY|SUZUKI|SV|SWATCH|SWIFTCOVER|SWISS|SX|SY|SYDNEY|SYMANTEC|SYSTEMS|SZ|TAB|TAIPEI|TALK|TAOBAO|TARGET|TATAMOTORS|TATAR|TATTOO|TAX|TAXI|TC|TCI|TD|TDK|TEAM|TECH|TECHNOLOGY|TEL|TEMASEK|TENNIS|TEVA|TF|TG|TH|THD|THEATER|THEATRE|TIAA|TICKETS|TIENDA|TIFFANY|TIPS|TIRES|TIROL|TJ|TJMAXX|TJX|TK|TKMAXX|TL|TM|TMALL|TN|TO|TODAY|TOKYO|TOOLS|TOP|TORAY|TOSHIBA|TOTAL|TOURS|TOWN|TOYOTA|TOYS|TR|TRADE|TRADING|TRAINING|TRAVEL|TRAVELCHANNEL|TRAVELERS|TRAVELERSINSURANCE|TRUST|TRV|TT|TUBE|TUI|TUNES|TUSHU|TV|TVS|TW|TZ|UA|UBANK|UBS|UG|UK|UNICOM|UNIVERSITY|UNO|UOL|UPS|US|UY|UZ|VA|VACATIONS|VANA|VANGUARD|VC|VE|VEGAS|VENTURES|VERISIGN|VERSICHERUNG|VET|VG|VI|VIAJES|VIDEO|VIG|VIKING|VILLAS|VIN|VIP|VIRGIN|VISA|VISION|VISTAPRINT|VIVA|VIVO|VLAANDEREN|VN|VODKA|VOLKSWAGEN|VOLVO|VOTE|VOTING|VOTO|VOYAGE|VU|VUELOS|WALES|WALMART|WALTER|WANG|WANGGOU|WATCH|WATCHES|WEATHER|WEATHERCHANNEL|WEBCAM|WEBER|WEBSITE|WED|WEDDING|WEIBO|WEIR|WF|WHOSWHO|WIEN|WIKI|WILLIAMHILL|WIN|WINDOWS|WINE|WINNERS|WME|WOLTERSKLUWER|WOODSIDE|WORK|WORKS|WORLD|WOW|WS|WTC|WTF|XBOX|XEROX|XFINITY|XIHUAN|XIN|XN--11B4C3D|XN--1CK2E1B|XN--1QQW23A|XN--2SCRJ9C|XN--30RR7Y|XN--3BST00M|XN--3DS443G|XN--3E0B707E|XN--3HCRJ9C|XN--3OQ18VL8PN36A|XN--3PXU8K|XN--42C2D9A|XN--45BR5CYL|XN--45BRJ9C|XN--45Q11C|XN--4GBRIM|XN--54B7FTA0CC|XN--55QW42G|XN--55QX5D|XN--5SU34J936BGSG|XN--5TZM5G|XN--6FRZ82G|XN--6QQ986B3XL|XN--80ADXHKS|XN--80AO21A|XN--80AQECDR1A|XN--80ASEHDB|XN--80ASWG|XN--8Y0A063A|XN--90A3AC|XN--90AE|XN--90AIS|XN--9DBQ2A|XN--9ET52U|XN--9KRT00A|XN--B4W605FERD|XN--BCK1B9A5DRE4C|XN--C1AVG|XN--C2BR7G|XN--CCK2B3B|XN--CG4BKI|XN--CLCHC0EA0B2G2A9GCD|XN--CZR694B|XN--CZRS0T|XN--CZRU2D|XN--D1ACJ3B|XN--D1ALF|XN--E1A4C|XN--ECKVDTC9D|XN--EFVY88H|XN--ESTV75G|XN--FCT429K|XN--FHBEI|XN--FIQ228C5HS|XN--FIQ64B|XN--FIQS8S|XN--FIQZ9S|XN--FJQ720A|XN--FLW351E|XN--FPCRJ9C3D|XN--FZC2C9E2C|XN--FZYS8D69UVGM|XN--G2XX48C|XN--GCKR3F0F|XN--GECRJ9C|XN--GK3AT1E|XN--H2BREG3EVE|XN--H2BRJ9C|XN--H2BRJ9C8C|XN--HXT814E|XN--I1B6B1A6A2E|XN--IMR513N|XN--IO0A7I|XN--J1AEF|XN--J1AMH|XN--J6W193G|XN--JLQ61U9W7B|XN--JVR189M|XN--KCRX77D1X4A|XN--KPRW13D|XN--KPRY57D|XN--KPU716F|XN--KPUT3I|XN--L1ACC|XN--LGBBAT1AD8J|XN--MGB9AWBF|XN--MGBA3A3EJT|XN--MGBA3A4F16A|XN--MGBA7C0BBN0A|XN--MGBAAKC7DVF|XN--MGBAAM7A8H|XN--MGBAB2BD|XN--MGBAH1A3HJKRD|XN--MGBAI9AZGQP6J|XN--MGBAYH7GPA|XN--MGBBH1A|XN--MGBBH1A71E|XN--MGBC0A9AZCG|XN--MGBCA7DZDO|XN--MGBCPQ6GPA1A|XN--MGBERP4A5D4AR|XN--MGBGU82A|XN--MGBI4ECEXP|XN--MGBPL2FH|XN--MGBT3DHD|XN--MGBTX2B|XN--MGBX4CD0AB|XN--MIX891F|XN--MK1BU44C|XN--MXTQ1M|XN--NGBC5AZD|XN--NGBE9E0A|XN--NGBRX|XN--NODE|XN--NQV7F|XN--NQV7FS00EMA|XN--NYQY26A|XN--O3CW4H|XN--OGBPF8FL|XN--OTU796D|XN--P1ACF|XN--P1AI|XN--PBT977C|XN--PGBS0DH|XN--PSSY2U|XN--Q7CE6A|XN--Q9JYB4C|XN--QCKA1PMC|XN--QXA6A|XN--QXAM|XN--RHQV96G|XN--ROVU88B|XN--RVC1E0AM3E|XN--S9BRJ9C|XN--SES554G|XN--T60B56A|XN--TCKWE|XN--TIQ49XQYJ|XN--UNUP4Y|XN--VERMGENSBERATER-CTB|XN--VERMGENSBERATUNG-PWB|XN--VHQUV|XN--VUQ861B|XN--W4R85EL8FHU5DNRA|XN--W4RS40L|XN--WGBH1C|XN--WGBL6A|XN--XHQ521B|XN--XKC2AL3HYE2A|XN--XKC2DL3A5EE0H|XN--Y9A3AQ|XN--YFRO4I67O|XN--YGBI2AMMX|XN--ZFR164B|XXX|XYZ|YACHTS|YAHOO|YAMAXUN|YANDEX|YE|YODOBASHI|YOGA|YOKOHAMA|YOU|YOUTUBE|YT|YUN|ZA|ZAPPOS|ZARA|ZERO|ZIP|ZM|ZONE|ZUERICH|ZW)", "", RegexOptions.IgnoreCase);
    content = content.Replace("https", "").Replace("http", "").Replace("://", "").Replace("www.", "");
}


// fix spaces/tabs/newlines
string space_symbols = Convert.ToString((char)32) + Convert.ToString((char)160);
content = Regex.Replace(content, @"[\t]+", " ");
content = Regex.Replace(content, @"[" + space_symbols + @"]{2,}", " ");
content = Regex.Replace(content, @"([\n\r]+)[" + space_symbols + @"]+", "$1");
content = Regex.Replace(content, @"[" + space_symbols + @"]+([\n\r]+)", "$1");
content = Regex.Replace(content, @"[\n]{2,}", "\n");

// fix line endings to win style
content = content.Replace("\r", "\n");
content = Regex.Replace(content, @"[\n]{2,}", "\n");
content = content.Replace("\n", Environment.NewLine);

// fix spaces around some symbols
content = Regex.Replace(content, @"\s+([!%\),\.:;\?\]\}]+)", "$1");
content = Regex.Replace(content, @"([\.!,\?])([^\s\.!,\?]+)", "$1 $2");
// !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~

// remove duplicates #1
string[] content_lines = content.Split(new char[]{'\n'}, StringSplitOptions.RemoveEmptyEntries);
List<string> content_lines_lst = new List<string>();
foreach(string line in content_lines) {
    if (!content_lines_lst.Contains(line)) {
        content_lines_lst.Add(line);
    }
}
content = String.Join("\n", content_lines_lst);

// remove duplicates #2
content_lines_lst.Clear();
content_lines = content.Split(new string[]{". "}, StringSplitOptions.RemoveEmptyEntries);
foreach(string line in content_lines) {
    if (!content_lines_lst.Contains(line)) {
        content_lines_lst.Add(line);
    }
}
content = String.Join(". ", content_lines_lst);

content = content.Trim();


// binary data heuristic
/*
https://docs.microsoft.com/en-us/dotnet/standard/base-types/character-classes-in-regular-expressions#unicode-category-or-unicode-block-p
https://www.unicode.org/reports/tr44/
https://docs.microsoft.com/en-us/dotnet/standard/base-types/character-classes-in-regular-expressions#supported-named-blocks
*/
MatchCollection mc = Regex.Matches(content, @"[\p{P}\p{S}\p{C}]");
int count = 0;
string[] good_punct = {"!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", ":", ";", "<", "=", ">", "?", "@", "[", "\\", "]", "^", "_", "`", "{", "|", "}", "~", "\n", "\r", "\t", Convert.ToString((char)32), Convert.ToString((char)160)};
foreach(Match m in mc) {
    if (!good_punct.Contains(m.Value)) {
        count++;
    }
}

double max_percent = (content.Length / 100.0) * 15;
if (count > max_percent) {
    content = "";
}

// digits heuristic
mc = Regex.Matches(content, @"[0-9]");
max_percent = (content.Length / 100.0) * 75;
if (mc.Count > max_percent) {
    content = "";
}



// save meta info
Dictionary<string, string> data = new Dictionary<string, string>() {
    {"url", project.Variables["IN_url"].Value},
    // можно добавить свои мета данные (как в примере строчкой выше)
};
List<string> data_lines = new List<string>();
foreach(KeyValuePair<string, string> kv in data) {
    data_lines.Add(
        String.Format("<{0}>{1}</{0}>", kv.Key, kv.Value)
    );
}

return content;
@Wadim Спасибо за решение!
 
Last edited:

Sanekk

Client
Joined
Jun 24, 2016
Messages
999
Reaction score
390
Points
63
на входе массив:
offer_id:product_id;offer_id:product_id;offer_id:product_id
0001:351;0002:352;0003:353

нужно сформировать json для запроса по АПИ. Вот пример:
JSON:
{
  "stocks": [
    {
      "offer_id": "0001",
      "product_id": 351,
      "stock": 0,
      "warehouse_id": 22142605386000
    },
    {
      "offer_id": "0002",
      "product_id": 352,
      "stock": 0,
      "warehouse_id": 22142605386000
    },
    {
      "offer_id": "0003",
      "product_id": 353,
      "stock": 0,
      "warehouse_id": 22142605386000
    }
  ]
}
Значения warehouse_id всегда 22142605386000
Значения stock = 0

тут другой структуры запрос сделал BAZAg , но я что то даже по аналогии сделать не могу, то что сейчас нужно...
 
Last edited:

samsonnn

Client
Joined
Jun 2, 2015
Messages
1,899
Reaction score
1,641
Points
113
на входе массив:
offer_id:product_id;offer_id:product_id;offer_id:product_id
0001:351;0002:352;0003:353

нужно сформировать json для запроса по АПИ. Вот пример:
JSON:
{
  "stocks": [
    {
      "offer_id": "0001",
      "product_id": 351,
      "stock": 0,
      "warehouse_id": 22142605386000
    },
    {
      "offer_id": "0002",
      "product_id": 352,
      "stock": 0,
      "warehouse_id": 22142605386000
    },
    {
      "offer_id": "0003",
      "product_id": 353,
      "stock": 0,
      "warehouse_id": 22142605386000
    }
  ]
}
Значения warehouse_id всегда 22142605386000
Значения stock = 0

тут другой структуры запрос сделал BAZAg , но я что то даже по аналогии сделать не могу, то что сейчас нужно...
122798

122799

122800

Чтоб код заработал, нужно подключить библиотеку Newtonsoft.Json, добавить директивы using и общий код, и прописать using Newtonsoft.Json; Добавить ссылки из GAC и выбрать там саму библиотеку Newtonsoft.Json которая находится в папке: C:\Program Files\ZennoLab\RU\ZennoPoster Pro V7\7.7.4.0\Progs\ExternalAssemblies

C#:
string input = project.Variables["Json_input"].Value;
        string[] pairs = input.Split(';');
        List<object> stocks = new List<object>();
        foreach (string pair in pairs)
        {
            string[] parts = pair.Split(':');
            if (parts.Length == 2)
            {
                string offerId = parts[0];
                int productId = Convert.ToInt32(parts[1]);

                var stockItem = new
                {
                    offer_id = offerId,
                    product_id = productId,
                    stock = 0,
                    warehouse_id = 22142605386000
                };
                stocks.Add(stockItem);
            }
        }
string json = JsonConvert.SerializeObject(new { stocks });
project.Variables["Json_result"].Value = json;
project.SendInfoToLog(json, true);
P.S C# код помог написать ChatGPT.
122810
 
Last edited:
  • Thank you
Reactions: Sanekk

Users Who Are Viewing This Thread (Total: 6, Members: 0, Guests: 6)