Найти повторяющиеся слова в тексте и посчитать количество повторений каждого из слов C#

299
09 мая 2018, 01:48

Оффтоп: я новичок, пытаюсь постигать язык программирования, но мне как самоучке это не быстро идет. Суть задачи: есть текстовый файл (лог от программы, для примера взял его). В каждом предложении текста может быть ключевое слово, или даже несколько раз повторяться одно и тоже слово (пример ключевых слов {"Info", "Trace", "Debug", "Warn"}). Требуется посчитать сколько раз каждое ключевое слово фигурировало в тексте, а если в некоторых предложениях одно и тоже ключевое слово употреблялось более 1 раза, то посчитать за 1 повторение. Предложение имеет вид:{"instance":"2C768A564246", "code":"-1157555488", "product":"", "version":"52065", "component":"Server.Service", "severity":"Trace", "time":"2018-04-29T03:01:10.0609148+03:00", "message":"Vacuum таблицы: \"public\".\"passport\", время выполнения 00:00:00.7131481", "thread":"9", "activity":"", "transaction":"", "exception":""}

Я научился читать текст из файла, но пока не понял как сделать функцию поиска. Мой код для чтения текста из файла:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace ReadFileAndCount
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @"d:\Test.log";
            string line;
            if (File.Exists(path))
            {
                StreamReader file = null;
                try
                {
                    file = new StreamReader(path, Encoding.UTF8);
                    while ((line = file.ReadLine()) != null)
                    {
                        Console.WriteLine(line);
                    }
                }
                finally
                {
                    if (file != null)
                        file.Close();
                }
            }
            Console.ReadKey(true);
        }
    }
}

Прошу помочь с написанием функции поиска по ключевым словам и выводу количества повторений каждого ключевого слова.

Answer 1

Попытаюсь расписать алгоритм:

  1. Хорошо бы хранить искомые слова в словаре Dictionary<string,int> Где ключ-это слово, а значение- это кол-во встречаемости
  2. Приступаете к чтению файла. С этим у вас проблем нету, как я вижу.
  3. Теперь мы столкнулись с проблемой. А что мы считаем за предложение? Могут быть всякие цитаты и все такое и многие многие другие случае. Т.е нельзя считать однозначно за предложение [!.?]. Если у вас 1 предложение=1 строчки, то эта проблема отпадает.
  4. Вызываем на предложении метод Split()(или RegEx.Split() так как Split() может захватить знаки препинания...) с делением по пробелу и получаем коллекцию слов
  5. Проводим итерацию этих слов через наш словарь. Если значение есть в словаре, то делаем инкремент.

Вы привели такой пример в комментах:

{"instance":"2C768A564246", "code":"-1157555488", "product":"", "version":"52065", "component":"Server.Service", "severity":"Trace", "time":"2018-04-29T03:01:10.0609148+03:00", "message":"Vacuum таблицы: \"public\".\"passport\", время выполнения 00:00:00.7131481", "thread":"9", "activity":"", "transaction":"", "exception":""}

Это похоже на JSON, что может облегчить вам задачу в разы.

Описываете класс, который соответствует этой структуре, далее используете библиотеку для десериализации из JSON, например Json.NET и парой строк кода заполняете класс данными.

READ ALSO
Считывание выбранного элемента из XML (XDocument)

Считывание выбранного элемента из XML (XDocument)

Какая команда в XDocument аналогична строке из xmlDocument: pictureBoxItem1ImageLocation = xmlDoc

190
Создание разного количества DropDownlist в MVC

Создание разного количества DropDownlist в MVC

Грубо говоря, есть основная запись в БД (Processing), есть коллекция - к каким темам относится основная запись (EmailTheme)Для этого написаны следующие...

167
заглушка для REST сервера для юнит тестов

заглушка для REST сервера для юнит тестов

Пишу я REST клиента и хочется мне его тестами покрыть, а зависеть от внешних сервисов не хочетсяREST API сервиса, к которому подключаться я знаю,...

144
Logout Vk webbrowser

Logout Vk webbrowser

Сделал авторизацию в webbrowser, но как выйти из учетки вк? Побывал через https://loginvk

175