Уникальные слова в файле Microsoft Word в C#
Этот пример является модификацией более раннего сообщения Перечислить уникальные слова в файле Microsoft Word на C# . Эта программа считывает слова в текстовом файле Microsoft, сортирует их, а затем отображает уникальные слова в списке.
Я иногда использую эту программу для поиска орфографических ошибок в книгах, которые я пишу. Иногда бывает трудно заметить, что Слово помешало конкретное слово как ошибочное. Я могу использовать предыдущий пример, чтобы составить список всех слов, а затем искать любые ошибки с ошибками.
Сейчас я работаю над новой книгой (я расскажу подробности в ближайшие несколько недель), и я решил изменить этот пример, чтобы сделать его более полезным. Эта версия добавляет две новые функции.
Сначала он записывает уникальные слова в файл. Затем я могу скопировать и вставить его содержимое в новый документ Microsoft Word и позволить Word проверять отдельные слова на наличие орфографических ошибок.
Во-вторых, эта версия разбивает слова, которые находятся в чехле Паскаля или на верблюжьем корпусе. Например, фрагмент кода может содержать слово «PreviwMouseDown». Этот тип опечатки особенно трудно обнаружить, поскольку Microsoft Word помещает все слова Pascal и верблюда в качестве орфографических ошибок, поэтому становится слишком легко игнорировать предупреждения. Программа разбивает это слово на «Previw Mouse Down». Теперь, когда Word помещает первую часть «Previw» в качестве ошибки, гораздо проще увидеть, что это действительно неправильно написано.
Следующий код показывает, как программа обрабатывает слова указанного файла.
// Список слов в файле. private void btnListWords_Click(object sender, EventArgs e) { Cursor = Cursors.WaitCursor; // Получить текст файла. FileInfo file_info = new FileInfo(txtFile.Text); string extension = file_info.Extension.ToLower(); string txt; if ((extension == ".doc") || (extension == ".docx")) { txt = GrabWordFileWords(txtFile.Text); } else { txt = File.ReadAllText(txtFile.Text); } // Использование регулярных выражений для замены символов // это не буквы или числа с пробелами. Regex reg_exp = new Regex("[^a-zA-Z0-9]"); txt = reg_exp.Replace(txt, " "); // Разделить текст на слова. string[] words = txt.Split( new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); // Используйте LINQ для получения уникальных слов. var word_query = (from string word in words orderby word select ToProperCase(word)).Distinct(); // Отображение результата. string[] result = word_query.ToArray(); File.WriteAllText("words.txt", string.Join(Environment.NewLine, result)); lstWords.DataSource = result; lblSummary.Text = result.Length + " words"; Cursor = Cursors.Default; }
Этот код использует метод GrabWordFileWords, описанный в более раннем сообщении, чтобы получить слова, содержащиеся в файле. (Подробности см. В этом сообщении.)
Далее код использует регулярное выражение для преобразования специальных символов, таких как _ и & amp; в пространства. Затем он использует метод string класса Split для разделения текста на слова, разделенные пробелами.
Затем программа использует запрос LINQ для вызова метода ToProperCase, который кратко описывается для каждого из слов. Он выбирает результат этого метода и заказывает результаты словами. (Вероятно, нужно упорядочить их ToProperCase (word), но, вероятно, это не имеет большого значения для упорядочения.)
Программа заканчивается, отображая результаты в окне списка и записывая слова в файл.
В следующем коде показан метод ToProperCase.
private string ToProperCase(string word) { string result = word[0].ToString(); for (int i = 1; i < word.Length; i++) { char ch = word[i]; if (char.IsUpper(ch)) result += " "; result += ch.ToString(); } return result; }
Этот метод создает строку результата и добавляет к ней первый символ входного слова. Затем код перебирает оставшиеся символы слова. Когда он видит заглавную букву, он добавляет пробел к результату до этой буквы. Затем код добавляет письмо к результату.
После завершения обработки букв слова метод возвращает завершенный результат.