Найти индекс нескольких ключевых слов в данном текстовом файле - PullRequest
0 голосов
/ 08 марта 2019

Я хочу найти индекс / смещение пакета ключевых слов в данном текстовом файле.Теперь я сталкивался со многими вопросами по stackoverflow, но ответ этот один подходит мне лучше всего.

Единственная проблема здесь заключается в том, что вышеуказанные вопросы обеспечивают решение только для одного ключевого слова, в то время какУ меня есть более 25 ключевых слов для поиска, и я думаю, что должно быть лучшее решение, чем писать switch...case или if...else для каждого ключевого слова.

Как я могу оптимизировать свою задачу здесь?Любой лучший подход, кроме связанного вопроса, также приветствуется.

Допустим, мой текстовый файл имеет следующее содержимое:

Стивен Харен, декабрь, 9,4055551235

Лора Клаузинг, январь 23,4054447788

Уильям Коннор, декабрь 13,123456789

Кара Мари, октябрь, 23,1593574862

Одри Кэррит, 16 января,1684527548

Себастьян Бейкер, октябрь, 23,9184569876

И ключевые слова, которые я хочу найти:

декабрь, январь, март, апрель, май

Теперь выходные данные должны быть:

Декабрь: 16

Январь: общий индекс January в строке 2

Декабрь: общий индекс January в строке 3

....

Текущий код:

class Program
    {
        static void Main(string[] args)
        {
            var keyword = "December";
            var keyword2 = "January";
            int totalLength = 0;
            using (var sr = new StreamReader("file.txt"))
            {
                while (!sr.EndOfStream)
                {
                    var line = sr.ReadLine();
                    if (String.IsNullOrEmpty(line)) continue;
                    if (line.IndexOf(keyword, StringComparison.CurrentCultureIgnoreCase) >= 0)
                    {
                        Console.WriteLine("December: " + (totalLength + line.IndexOf(keyword, StringComparison.CurrentCultureIgnoreCase)));
                    }
                    if (line.IndexOf(keyword2, StringComparison.CurrentCultureIgnoreCase) >= 0)
                    {
                        Console.WriteLine("January: " + (totalLength + line.IndexOf(keyword, StringComparison.CurrentCultureIgnoreCase)));
                    }
                    .................
                  ........................................................

                    totalLength += line.Length;
                }

            }
        }
    }

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

1 Ответ

0 голосов
/ 08 марта 2019

Я бы определенно предложил вам проверить структуру данных Trie.

Хорошая реализация Tries будет искать входной текст посимвольно и возвращать всякий раз, когда он достигает конца распознанного слова.Это чрезвычайно эффективная среда выполнения (приблизительно O (n + m)), и это неплохо, когда речь идет о потреблении памяти.(К вашему сведению: в этом случае n - длина введенного текста, а m - длина слова, которое вы ищете).

Я нашел следующее руководство по теме:

https://www.geeksforgeeks.org/trie-insert-and-search/

А вот хорошая реализация, которую я нашел через StackOverflow :

http://www.glennslayden.com/code/c-sharp/trie

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