Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

12 Ноябрь 2019, 09:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Часто задаваемые вопросы по LibreOffice и Apache OpenOffice.org
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Как отсортировать абзацы с текстом по годам?  (Прочитано 3196 раз)
0 Пользователей и 1 Гость смотрят эту тему.
neft
Форумчанин
***
Offline Offline

Сообщений: 189


« Стартовое сообщение: 23 Декабрь 2011, 14:36 »

Вот возникла задачка со списком научных работ, скачанных с elibrary.ru.
Список работ не отсортирован по годам, и его нужно отсортировать по убыванию.
Как можно это сделать наиболее эффективно и просто в Writer?



[вложение удалено Администратором]
Записан
Рыбка Рио
Форумчанин
***
Offline Offline

Сообщений: 1 678


« Ответ #1: 23 Декабрь 2011, 15:49 »

Вот такой макрос может это сделать:

REM  *****  BASIC  *****

Sub Main
Doc = ThisComponent
SD = Doc.createSearchDescriptor()
SD.SearchRegularExpression = TRUE
StringsAr = Array("19[:digit:]{2}","20[:digit:]{2}")
M = ubound(StringsAr)
Dim Years(0) As Long
Dim Indexes(0) As Long

tLng=0
tInd=0
NewDoc = StarDesktop.loadComponentFromURL( "private:factory/swriter", "_blank", 0, Array() )
NewTK = NewDoc.Text.createTextCursor()
For i=0 to M
   SD.SearchString = StringsAr(i)
   Results = Doc.findAll(SD)
   N = Results.Count-1
   Redim Years(N) As Long
   Redim Indexes(N) As Long
   For j=0 to N
      Indexes(j)=j
   Next

   For j=0 to N
      Years(j) = cLng(Results(j).String)
   Next
   For k=0 to N
   For j=0 to N-1
      If Years(j)>Years(j+1) then
         tInd = Indexes(j)
         Indexes(j) = Indexes(j+1)
         Indexes(j+1) = tInd
         tLng = Years(j)
         Years(j) = Years(j+1)
         Years(j+1) = tLng
      Endif
   Next
   Next
   'For j=0 to N
   '   NewTK.String = cStr(Years(Indexes(j)))+chr(13)
   '   NewTK.gotoEnd(FALSE)
   'Next   
   For j=0 to N
      TK = Doc.Text.createTextCursorByRange(Results(Indexes(j)))
      TK.gotoStartOfParagraph(FALSE)
      TK.gotoEndOfParagraph(TRUE)
      NewTK.String = TK.String + chr(13)+chr(13)
      NewTK.gotoEnd(FALSE)
   Next
Next
NewDoc.setModified(FALSE)
End Sub


[вложение удалено Администратором]
Записан

ubuntu 12.04 + LibO3.6.0
neft
Форумчанин
***
Offline Offline

Сообщений: 189


« Ответ #2: 23 Декабрь 2011, 16:32 »

Клио, спасибо за ответ.
Но там есть одна неприятность.
В тексте одной работы, кроме 2010 года, ещё 2 раза встречается число 2010, и макрос записывает 3 копии этой работы.
А если бы там ещё и страницы были бы С. 1970-1973, то было бы 5 копий.


PS. Можно легко менять порядок сортировки
Цитата:
NewTK.gotoEnd(FALSE)      ' сортировка по возрастанию
NewTK.gotoStart(FALSE)      ' сортировка по убыванию
« Последнее редактирование: 23 Декабрь 2011, 17:12 от neft » Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!