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

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
631
Благодарностей
542
Баллы
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
 
  • Спасибо
Реакции: Alexmd и udder

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 383
Баллы
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
 
Последнее редактирование:
  • Спасибо
Реакции: Ilshakin, samsonnn и udder

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
631
Благодарностей
542
Баллы
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% (это отвечая на вопрос, обращался ли я к ИИ)

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

 
  • Спасибо
Реакции: Alexmd

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 650
Благодарностей
1 318
Баллы
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
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 383
Баллы
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
 
Последнее редактирование:
  • Спасибо
Реакции: Ilshakin

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
631
Благодарностей
542
Баллы
93
  • Спасибо
Реакции: Alexmd

SVRyzhov

Client
Регистрация
17.05.2017
Сообщения
47
Благодарностей
5
Баллы
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

Новичок
Регистрация
26.04.2023
Сообщения
15
Благодарностей
1
Баллы
3
Привет, нужна помощь, у меня такая задача:
Я регаю акаунты почтового сервиса. Я пробую у себя на телефоне у меня одни капчи (очень простые), а через зенку другие (очень сложные) как мне добится значения как на телефоне?
(FиnCaptcha)
 

Sanekk

Client
Регистрация
24.06.2016
Сообщения
988
Благодарностей
388
Баллы
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
Регистрация
02.06.2015
Сообщения
1 650
Благодарностей
1 318
Баллы
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("Невозможно распределить товар между складами!");
}
 
Последнее редактирование:
  • Спасибо
Реакции: Sanekk

doc

Client
Регистрация
30.03.2012
Сообщения
8 606
Благодарностей
4 597
Баллы
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);
 
  • Спасибо
Реакции: Sanekk

Vasyl1

Client
Регистрация
11.12.2016
Сообщения
194
Благодарностей
20
Баллы
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);
 
  • Спасибо
Реакции: Sanekk

udder

Client
Регистрация
28.03.2017
Сообщения
595
Благодарностей
118
Баллы
43
Интересует сниппет, который возьмет случайную строку с вхождением одного из слов, регистр не учитывать
например есть список со словами
Дыня
Арбзуз полосатый
Яблоко зеленое
Слива
Фрукты спелые
Овощи

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

ZSharp

Client
Регистрация
29.09.2013
Сообщения
387
Благодарностей
121
Баллы
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);
}
 
  • Спасибо
Реакции: udder

ikibostus

Client
Регистрация
27.09.2015
Сообщения
252
Благодарностей
26
Баллы
28
Приветствую! Интересует сниппет, который поднимет асинхронный поток и в течение 5 минут будет проверять глобальную переменную. Если за 5 минут глабалка не увеличится, то прервать все потоки и по-новой запустить шаблон.
 

udder

Client
Регистрация
28.03.2017
Сообщения
595
Благодарностей
118
Баллы
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
Регистрация
27.09.2015
Сообщения
252
Благодарностей
26
Баллы
28
Спасибою но как как получить результат в перменную, а не в лог?
Если у экшена C# указать переменную "Положить результат в переменную" то ответ OK
Замени эту строку
project.SendInfoToLog(result, true);
на project.Variables["peremennaya"].Value = result;
Предварительно создай переменную "peremennaya".
 
  • Спасибо
Реакции: udder

ZSharp

Client
Регистрация
29.09.2013
Сообщения
387
Благодарностей
121
Баллы
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();
 
  • Спасибо
Реакции: udder

baracuda

Client
Регистрация
19.06.2013
Сообщения
733
Благодарностей
247
Баллы
43
Господа есть таблица. полу заполненная 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
Регистрация
08.11.2015
Сообщения
1 760
Благодарностей
2 399
Баллы
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, чтобы убедиться в этом (если не существует, значит эта последняя ячейка точно пуста).
 
  • Спасибо
Реакции: baracuda

baracuda

Client
Регистрация
19.06.2013
Сообщения
733
Благодарностей
247
Баллы
43
Могу ошибаться, но может быть такое, что rowDataArray[columnIndex] не существует.
Я проверил бы ещё длину массива rowDataArray, чтобы убедиться в этом (если не существует, значит эта последняя ячейка точно пуста).
Всё верно в таблице ";;;;;;;;;;;;;;;;;;;;;;" нет пустых значений в ячейках как оказалось. это не пустые значения... точнее тут в 8 колонке как бы есть значение, а в 11 нету. парадокс и в 3 нету, а в 4 есть
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 760
Благодарностей
2 399
Баллы
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
Регистрация
17.10.2016
Сообщения
5
Благодарностей
1
Баллы
3
Нужен такой снипет, чтобы после каждого слова ставилась запятая, убирались слова менее 3 символов, и убирались все символы, к примеру:

БЫЛО

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

СТАЛО

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

doc

Client
Регистрация
30.03.2012
Сообщения
8 606
Благодарностей
4 597
Баллы
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);
 
  • Спасибо
Реакции: Veromilja

Manless

Client
Регистрация
09.01.2014
Сообщения
186
Благодарностей
33
Баллы
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
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 383
Баллы
113
C#:
project.Variables["tov_Cofe"].Value = double.TryParse(project.Variables["tov_Cofe"].Value.Replace(".", ","), out double d) ? d.ToString() : "0";
 
  • Спасибо
Реакции: Manless

Manless

Client
Регистрация
09.01.2014
Сообщения
186
Благодарностей
33
Баллы
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
Регистрация
28.03.2017
Сообщения
595
Благодарностей
118
Баллы
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 Спасибо за решение!
 
Последнее редактирование:

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