Коллекция Word Words — Разбивка текста на слова

Коллекция Word Words — Разбивка текста на слова Объектная модель Microsoft Word

Коллекция Words позволяет разбить текст на слова, и обработать их в индивидуальном порядке. Сама коллекция Words содержит набор объектов Range, что позволяет выбрать или выделить каждое слово.

Сама коллекция Words довольно проста, так как содержит минимум свойств и методов, которые пригодятся, что бы разбить текст на слова. Доступ к коллекции осуществляется через одноименное свойство, которое есть у таких объектов как:

  • Range – отвечает за выбор текста.
  • Selection – отвечает за выделение текста.
  • Document – содержит сам документ Word.

Это хорошо, так как мы можем выбрать или выделить нужный диапазон и подсчитать в нем количество слов, или – можно в групповом порядке обработать несколько документов и содержащихся в них словах (изменить цвет, размер, стиль и так далее)

Свойства

Application — Возвращает объект Application, представляющий приложение Microsoft Word.

Count – Содержит количество слов в коллекции. Стоит учитывать, что знаки пунктуации и сам перевод строки тоже будут считаться отдельными словами-объектами.

First — Возвращает объект Range, представляющий первое слово в коллекции слов.

Last — Возвращает объект Range, представляющий последнее слово в коллекции слов.

Методы

Item(index) — Возвращает отдельный объект Range в коллекции Words.

Index – Номер объекта.

Для доступа к отдельному слову можно напрямую указать его номер в круглых скобках после имени объекта, например:

Set oWords = ActiveDocument.Words
oWors(3)

Как видим, количество материала мало – а если возможности ограничены, то начинает работать смекалка. И так, для закрепления материала мы напишем два примера на языке программирования VBScript и JScript. Задачи программного кода следующие:

  • Создать новый документ
  • Вставить в документ заданный текст
  • Отформатировать текст
  • Разбить текст на слова и определить общее количество слов и количество слов в каждом абзаце.
  • Как бонус – надо определить количество слов, выделенных жирным стилем.
' ----------------------------------------------------------------------------
' Разбивка текста на слов и подсчет их количества
' Words.vbs
' ----------------------------------------------------------------------------
Option Explicit
 
dim oWord, oDoc, oSel, oRange, oPars, oWords
dim REnd, i, j, LText, LRandom
dim oParsCount, oWordsCount, oWordsCountAll, oWordsCountBold
 
oWordsCount = 0
oWordsCountAll = 0
oWordsCountBold = 0
 
set oWord = WScript.CreateObject("Word.Application")    ' Объект Word
set oDoc = oWord.Documents                                            ' Коллекция Documents
oDoc.Add()                                                                            ' Создаем новый документ
set oSel = oWord.Selection                                                    ' Объект Selection
oWord.Visible = True                                                            ' Делаем документ видимым
set oRange = oDoc(1).Range()                                            ' Объект Range
 
LText= "Нужно разбить текст на слова, отформатировать его и  - получить статистику. Ура! "
 
For i=0 to 5
    oSel.TypeText LText & LText & LText
    oSel.TypeParagraph 
Next
 
set oPars = oRange.Paragraphs                                             ' Коллекция Paragraps
set oWords = oRange.Words                                                ' Коллекция Words
 
REnd = oPars(oPars.Count).Range.End                                ' Конечная позиция в тексте
 
randomize                                                                                ' включаем генератор случайных чисел
 
' -------------------------------------------------------------------
' Делаем слово жирным в случайном порядке
' -------------------------------------------------------------------
for i = 1 to oWords.Count
    LRandom=int(rnd(1)*3)
    if LRandom<2 then
        oWords(i).Font.Bold=true
    end if
next
' -------------------------------------------------------------------
 
call WordsStatistik
MsgBox oParsCount & vbCrLf & "Всего слов - " & oWordsCountAll & vbCrLf & "Жирных слов - " & oWordsCountBold
 
' -------------------------------------------------------------------
' Разбиваем текст на слова и делаем подсчеты
' -------------------------------------------------------------------
Sub WordsStatistik()
dim PC
    PC = oPars.Count
    for i = 1 to PC
        call LRange(i, i)
        for j = 1 to oWords.Count
            if ((oWords(j) <> ". ") and (oWords(j) <> "! ") and (oWords(j) <> ", ") and (oWords(j) <> "- ") and (oWords(j) <> Chr(13))) then
                oWordsCount = oWordsCount + 1
                if oWords(j).Font.Bold = true then
                    oWordsCountBold = oWordsCountBold + 1
                end if
            end if
        next
        oParsCount = oParsCount & "Абзац " & i & " слов: " & oWordsCount & vbCrLf                                                                                                                                                                                ' разбить текст на слова
        oWordsCountAll = oWordsCountAll + oWordsCount
        oWordsCount = 0
    next
End Sub
 
' -------------------------------------------------------------------
' Параметры выбора абзаца
' -------------------------------------------------------------------
Sub LRange(a, b)
    oRange.SetRange 0, REnd
    oRange.SetRange oPars(a).Range.Start, oPars(b).Range.End
End Sub
// ----------------------------------------------------------------------------
// Разбивка текста на слов и подсчет их количества
// Words.js
// ----------------------------------------------------------------------------
var oWord, oDoc, oSel, oRange, oPars, oWords;
var REnd, i, j, LText, LRandom;
var oParsCount = "", oWordsCount = 0, oWordsCountAll = 0, oWordsCountBold = 0;
 
oWord = WScript.CreateObject("Word.Application");    // Объект Word
oDoc = oWord.Documents;                                                // Коллекция Documents
oDoc.Add();                                                                        // Создаем новый документ
oSel = oWord.Selection;                                                    // Объект Selection
oWord.Visible = true;                                                        // Делаем документ видимым
oRange = oDoc(1).Range();                                                // Объект Range
 
LText= "Нужно разбить текст на слова, отформатировать его и  - получить статистику. Ура! ";
 
for (i=0; i<=5; i++){
    oSel.TypeText(LText + LText + LText)
    oSel.TypeParagraph();
}
 
oPars = oRange.Paragraphs;                                             // Коллекция Paragraps
oWords = oRange.Words;                                                // Коллекция Words
 
REnd = oPars(oPars.Count).Range.End;                        // Конечная позиция в тексте
 
// -------------------------------------------------------------------
// Делаем слово жирным в случайном порядке
// -------------------------------------------------------------------
for (i = 1; i<=oWords.Count; i++){
    LRandom=Math.random()
    if (LRandom<0.5){
        oWords(i).Font.Bold=true
    }
}
// -------------------------------------------------------------------
 
WordsStatistik()
WScript.Echo(oParsCount + "\nВсего слов - " + oWordsCountAll + "\nЖирных слов - " + oWordsCountBold)
 
// -------------------------------------------------------------------
// Разбиваем текст на слова и делаем подсчеты
// -------------------------------------------------------------------
function WordsStatistik(){
var PC = oPars.Count
    for (i = 1; i<=PC; i++){
        LRange(i, i)
        for (j = 1; j<=oWords.Count; j++){
            if ((oWords(j) != ". ") && (oWords(j) != "! ") && (oWords(j) != ", ") && (oWords(j) != "- ") && (oWords(j) != String.fromCharCode(13))){
                oWordsCount ++;
                if (oWords(j).Font.Bold){
                    oWordsCountBold ++;
                }
            }
        }
        oParsCount = oParsCount + "Абзац " + i + " слов: " + oWordsCount + "\n";                                                                                                                                                                                            // разбить текст на слова
        oWordsCountAll += oWordsCount;
        oWordsCount = 0;
    }
}
 
// -------------------------------------------------------------------
// Параметры выбора абзаца
// -------------------------------------------------------------------
function LRange(a, b){
    oRange.SetRange(0, REnd);
    oRange.SetRange(oPars(a).Range.Start, oPars(b).Range.End);
}

И так, программирование закончено, можно приступать к пояснениям…

Важно отметить, что сама коллекция Words учитывает и пробелы. Поясняю, допустим, у нас есть строка «Привет     Мир», между словами есть пять пробелов, и поэтому, в коллекции будут находиться два слова, причем первое слово будет содержать эти пробелы. Довольно неудобно, если честно, так как при написании программы для обработки и разбивки текста на слова, придется писать дополнительную строку кода, содержащую функцию для очистки строкового выражения (слова) от пробелов.

В самом сценарии мы создали две процедуры (функции):

WordsStatistik – Тут вначале происходит присвоение переменной PC значения oPars.Count (количество параграфов в тексте). Далее следуют два цикла for, в первом цикле происходит перебор всех абзацев, во втором цикле (он является вложенным) – происходит перебор всех слов для текущего абзаца. Также мы добавили условие проверки текущего значения коллекции Words, мы пропускаем перевод строки (ASCII код 13), запятую, восклицательный знак и точку. Конечно, если бы текст был неизвестным нам, то пришлось бы создать массив, содержащий все пунктуационные знаки. Далее следует еще одна вложенная проверка условия, а точнее, проверка на то, не является ли текущее слово выделено жирным шрифтом. В итоге, разбив текст по словам, мы получаем статистические данные, хранящиеся в переменных oParsCount – количество абзацев, oWordsCount – количество слов в текущем абзаце, oWordsCountAll – количество всех слов в тексте и oWordsCountBold – количество слов, выделенных жирным.

LRange(a, b) – тут происходит вызов метода SetRange объекта Range. Два параметра, которые принимает функция определяют начальный и конечный абзац, которые нужно выбрать.

В теле сценария мы используем генерацию случайных чисел, что бы в случайном порядке оформить некоторые слова жирным текстом. По сути, на этом все, мы попробовали программным путем разбить текст на слова и произвести их подсчет. Удачи, и до новых встреч.

Оцените статью
Технологии программирования и ведение блога
Добавить комментарий