Обработка текста. Удаление дубликатов

218
04 марта 2019, 00:10

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

using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
 namespace WordCount
{
    class Program
    {

        public static void EditorText(string a)
        {
            var newText = Regex.Replace(a, "[\"-.?!)(,:]", "");
            newText = string.Join(" ", newText.Split(' ').Distinct());
            using (var sw = File.AppendText(@"\p.txt"))
            {
                sw.Write(newText);
            }
        }
       public static void Main(string[] args)
        {
            StreamReader sr = new StreamReader(@"test\o.txt", Encoding.Default);
            var test = sr.ReadToEnd();
            StreamReader se = new StreamReader(@"\test\t.txt", Encoding.Default);
            var test2 = se.ReadToEnd();
            var test3 = test + test2;
            EditorText(test3);
        }
    }
}
Answer 1

Можно пойти таким путем:

Допустим есть файлы 1.txt, 2.txt и 3.txt. В будущем к примеру могут добавиться еще, значит мы можем сразу написать метод, который будет принимать массив файлов и их обрабатывать.

Создадим этот метод:
На вход он пусть принимает массив, а выходом будет одна строка со всеми уникальными словами.

public static string Check(params string[] files)
{
    var text = files.Where(File.Exists)
        .SelectMany(x => File.ReadAllText(x).Split())
        .Select(x => new string(x.Where(char.IsLetterOrDigit).ToArray()))
        .Where(x => !string.IsNullOrWhiteSpace(x))
        .Distinct(StringComparer.CurrentCultureIgnoreCase);
    return string.Join(" ", text);
}

Поясню что тут и как:

  • files.Where(File.Exists) - файлы, которые отсутствуют нам не подходят, поэтому мы смело берем только те, которые существую на диске.
  • .SelectMany(x => File.ReadAllText(x).Split()) - Читаем каждый файл и разбиваем текст по пробелу (заметьте, не обязательно ставить символ для разбития, если нам необходимо разбить по пробелу. Метод Split это делает по умолчанию!). На этом этапе у нас будет массив слов всех файлов.
  • .Select(x => new string(x.Where(char.IsLetterOrDigit).ToArray())) - Удаляем все лишние символы (кроме цифр и букв).
  • .Where(x => !string.IsNullOrWhiteSpace(x)) - чистим все от пустых строк (если есть).
  • .Distinct(StringComparer.CurrentCultureIgnoreCase); - Сверяем все слова и убираем те, что повторяются (CurrentCultureIgnoreCase здесь именно игнорирование регистра).
  • return string.Join(" ", text); - собираем строку из массива, разбивая слова пробелом и возвращаем ее.

Вызываем полученный метод:
Здесь мы вызываем наш метод Check, которому передаем все необходимые файлы для сравнения и результат выводим для примера в консоль.

Console.WriteLine(Check("1.txt","2.txt","3.txt"));

Для примера давайте заполним три файла некими данными:

  1. 1 2 3 4 5 6 7 8 9 0

  2. 1 2 7 9 12 63 84 3 78 677

  3. абв вба 1сс, qw/!2g - прр2

Запускаем и смотрим на результат:

1 2 3 4 5 6 7 8 9 0 12 63 84 78 677 абв вба 1сс qw2g прр2

Все значения у нас уникальны и текст подчищен (можно сравнить qw/!2g с результатом).
Удачи в изучении C#!

Answer 2

Проверьте, с моим примером сработало. Нужны будут правки, напишите в комментарии. Вот код:

 string [] text1 = "Много котов собак и птичек во дворе".Split(' ');
        string [] text2 = "Не много котов собак и попугаев в доме".Split(' ');
        HashSet<string> vs = new HashSet<string>();
        var a = text1.Concat(text2);
        foreach (var item in a)
        {
            vs.Add(item.ToLower());
        }
        foreach (var item in vs)
        {
            Console.WriteLine(item);
        }
//Вывод:
//много
//котов
//собак
//и
//птичек
//во
//дворе
//не
//попугаев
//в
//доме
READ ALSO
Unity Помогите разобраться со скриптом

Unity Помогите разобраться со скриптом

Недавно столкнулся с проблемой пересечения нескольких Scroll Rect'овК сожалению, ответа на данном сайте и его западном брате не получил

195
Проблема с длинными числами в алгоритме DSA на C#

Проблема с длинными числами в алгоритме DSA на C#

Мне нужно посчитать число 2 в степени (p-1)/q и найти остаток деления результата на p, где p имеет размерность 1024 бита, а q 128, тип данных чисел - BigIntegerЯ...

192
Как получить элементы из списка?

Как получить элементы из списка?

Есть метод переопределения, который вытаскивает последние n-элементов спискаДопустим списке у меня 10 элементов, а хочу я получить 100 элементов

191
Подскажите разницу между классами Monitor и Mutex

Подскажите разницу между классами Monitor и Mutex

Теоретический вопросЕсли нам нужно синхронизировать потоки, то в большинстве случаев наверное достаточно lock, это почти то же самое, что...

210