Слова (предложения) из Writer в Calc

Автор RFJ, 10 апреля 2011, 18:24

0 Пользователи и 1 гость просматривают эту тему.

RFJ

Вот такая задачка:
Есть некий текст в документе Writer.
Нужно с помощью макроса
1. Каждое предложение из текста Writer записать в таблицу Calc в столбец по строкам.
2. Каждое слово из текста Writer записать в таблицу Calc в столбец по строкам.
   (отсортировать по алфавиту и убрать повторения - создать словарь)

PS. Нужно это сделать именно макросом, за один проход, без промежуточных файлов (типа CSV).

Рыбка Рио

Макрос выводит и сортирует в Calc слова, встречающиеся более 1 раза:

Sub Main
Dim SD As Object
Dim S As String
Dim L, i, j, k As Long

oDoc = ThisComponent
SD = oDoc.createSearchDescriptor
SD.SearchRegularExpression = TRUE
SD.SearchCaseSensitive = FALSE
SD.SearchString = "[:alpha:]{1,}"
oResult = oDoc.findAll(SD)
L = oResult.Count
Dim Words(L) As String
Dim WordsCount(L) As Long

If L=0 then Exit Sub

   For i = 0 To L-1
      oFound = oResult.getByIndex(i)
      oFoundCursor = oFound.Text.createTextCursorByRange(oFound)
      Words(i) = oFoundCursor.String
   Next

Dim NewCalc As Object
Dim oSheet As Object
Dim p(0) as new com.sun.star.beans.PropertyValue
   p(0).Name = "Hidden"
   p(0).Value = False
   NewCalc = StarDesktop.loadComponentFromURL( "private:factory/scalc", "_blank", 0, p())
   oSheet = NewCalc.Sheets.getByIndex(0)

k=0
For i=0 to L-1
   If Words(i)<>"" then
      For j=i+1 to L-1
         If lCase(Words(i))=lCase(Words(j)) then
         Words(j)=""
         WordsCount(i)=WordsCount(i)+1
         Endif
      Next
   Endif
   If WordsCount(i)>0 then
   Words(k)=Words(i)
   WordsCount(k)=WordsCount(i)
   oSheet.getCellByPosition(0,k).Value = WordsCount(k)+1
   oSheet.getCellByPosition(1,k).String = Words(k)
   k=k+1
   Endif
Next
If k=0 then Exit Sub
'---
'из книжки http://pitonyak.org/AndrewMacro.odt
Dim oRange As Object
Dim aSortFields(0) As New com.sun.star.util.SortField
Dim prop(0) As New com.sun.star.beans.PropertyValue

  oRange = oSheet.getCellRangeByName("A1:B"+cStr(k))
  NewCalc.CurrentController.select(oRange)

  aSortFields(0).Field = 0
  aSortFields(0).SortAscending = FALSE

  prop(0).Name = "SortFields"
  prop(0).Value = aSortFields()
  oRange.Sort(prop())
'---
NewCalc.setModified(FALSE)
'NewCalc.close(TRUE)
End Sub
ubuntu 12.04 + LibO3.6.0

RFJ

#2
Спасибо.

Но встречающиеся только 1 раз тоже нужно выбирать.

Впрочем, понятно, как нужно переделать макрос.

RFJ

И еще осталась задача, как выбирать предложения из текста?

Рыбка Рио

Замените [:alpha:]{1,} на [^\.?!...]+
Есть ещё способ - создайте текстовый курсор, там есть методы:
goLeft                        ( [in] short nCount, [in] boolean bExpand )         boolean                  .text.XTextCursor                       
goRight                       ( [in] short nCount, [in] boolean bExpand )         boolean                  .text.XTextCursor                       
gotoEnd                       ( [in] boolean bExpand )                            void                     .text.XTextCursor                       
gotoEndOfParagraph            ( [in] boolean bExpand )                            boolean                  .text.XParagraphCursor                 
gotoEndOfSentence             ( [in] boolean Expand )                             boolean                  .text.XSentenceCursor                   
gotoEndOfWord                 ( [in] boolean bExpand )                            boolean                  .text.XWordCursor                       
gotoNextParagraph             ( [in] boolean bExpand )                            boolean                  .text.XParagraphCursor                 
gotoNextSentence              ( [in] boolean Expand )                             boolean                  .text.XSentenceCursor                   
gotoNextWord                  ( [in] boolean bExpand )                            boolean                  .text.XWordCursor                       
gotoPreviousParagraph         ( [in] boolean bExpand )                            boolean                  .text.XParagraphCursor                 
gotoPreviousSentence          ( [in] boolean Expand )                             boolean                  .text.XSentenceCursor                   
gotoPreviousWord              ( [in] boolean bExpand )                            boolean                  .text.XWordCursor                       
gotoRange                     ( [in] .text.XTextRange xRange, [in] boolean bExpand )  void                     .text.XTextCursor                       
gotoStart                     ( [in] boolean bExpand )                            void                     .text.XTextCursor                       
gotoStartOfParagraph          ( [in] boolean bExpand )                            boolean                  .text.XParagraphCursor                 
gotoStartOfSentence           ( [in] boolean Expand )                             boolean                  .text.XSentenceCursor                   
gotoStartOfWord               ( [in] boolean bExpand )                            boolean                  .text.XWordCursor                       

Видите тут есть gotoNextSentence. Таким способом можно и на слова текст разбить, и на параграфы, и на предложения.
ubuntu 12.04 + LibO3.6.0

RFJ

#5
Большое спасибо.

Цитата: Клио от 11 апреля 2011, 11:38
Замените [:alpha:]{1,} на [^\.?!...]+

Но при такой замене пропадают знаки препинания в конце предложений в CALC'e.