|
Vovans
|
 |
« : 9 Октября 2007, 23:18 » |
|
Как узнать кол-во символов в документе без пробелов? Все подвернувшиеся редактоы/процессоры это умеют (скажeм, gedit, abiword etc), а вот монстр ОО... тут был: http://qa.openoffice.org/issues/show_bug.cgi?id=10356и это читал: Имеется элегантное решение - делаем "Найти все" для пробела, Закрыть, Сервис - Количество слов и получаем искомую величинувыход, но несколько неудобно  Никому не попадались более удобные решения этого вопроса? Вот бы макрос такой.........  ((
|
|
|
|
Записан
|
|
|
|
|
|
|
rail
Раиль Алиев
Administrator
Участник
 
Offline
Сообщений: 4117
Откуда: Москва
|
 |
« Ответ #2 : 10 Октября 2007, 09:48 » |
|
Еще не реализовано, но даже в формате ODF предусмотрено.
|
|
|
|
|
Записан
|
|
|
|
|
Vovans
|
 |
« Ответ #3 : 10 Октября 2007, 19:54 » |
|
да уж  )
|
|
|
|
« Последнее редактирование: 11 Октября 2007, 13:49 от Санчо »
|
Записан
|
|
|
|
dr.Faust
Участник
 
Offline
Сообщений: 1303
Откуда: Ростов-на-Дону
Я не ищу трудных путей - я их прокладываю.
|
 |
« Ответ #4 : 10 Октября 2007, 22:32 » |
|
Еще не реализовано, но даже в формате ODF предусмотрено.
А можно поподробнее в этом месте?
|
|
|
|
|
Записан
|
|
|
|
rail
Раиль Алиев
Administrator
Участник
 
Offline
Сообщений: 4117
Откуда: Москва
|
 |
« Ответ #5 : 12 Октября 2007, 10:22 » |
|
Вот что предусмотрено для статистики текста в формате: meta:page-count meta:table-count meta:draw-count meta:image-count meta:object-count meta:ole-object-count meta:paragraph-count meta:word-count meta:character-count meta:row-count meta:frame-count meta:sentence-count meta:syllable-count meta:non-whitespace-character-count
|
|
|
|
|
Записан
|
|
|
|
|
Mike
|
 |
« Ответ #6 : 12 Октября 2007, 11:03 » |
|
meta:non-whitespace-character-count
кажется это то что нужно
|
|
|
|
|
Записан
|
|
|
|
|
Vovans
|
 |
« Ответ #7 : 14 Октября 2007, 16:54 » |
|
кажется это то что нужно И? Решения проблемы всё равно нет?
|
|
|
|
|
Записан
|
|
|
|
|
lemonjoe
|
 |
« Ответ #8 : 13 Ноября 2009, 00:58 » |
|
Макрос есть!  Мне предоставил его юзер по имени SkazochNick, за что выражаю ему персональное спасибо! Инструкция: Установка (ручная):
0. Запускай OO Writer У меня 3.1, но должно быть так же все
1. Сервис->Макросы->Управление макросами->OpenOffice Basic 2. Макрос из "Мои макросы" -> Standart (выделить) -> Управление 3. Здесь "Новый модуль". Называй его как хочешь, можешь как я "lettercounter". Выделяй его и "Редактировать" 4. Откроется редактор. Он дурной. Так что все что там есть сноси и копипасть вот это:
=========================== скопипастить ниже ================================= REM ***** BASIC *****
Sub Main
' для Lemojoe: ' Имеется текст. Необходим вывод на информационной табличке статистических данных: ' количество знаков с пробелами, количество знаков без пробелов. Чтобы подсчет ' можно было произвести в любой момент работы над документом.
Dim doc as object Dim controller as object Dim textviewcursor as object ' всякие объекты там... не важно Dim letters as String ' выделенная строка с текстом Dim gap as Integer ' число пробелов Dim cursign as String ' текущий значок dim break as Integer ' число переносов строк Dim i as Integer ' счетчик gap = 0 break = 0
' получаем current document -> controller -> view cursor doc = ThisComponent controller = doc.getCurrentController() textviewcursor = controller.getViewCursor()
letters = textviewcursor.getString ' забираем выделенный текст
For i = 1 To Len(letters)
cursign = Mid (letters, i, 1)
If cursign = chr(32) Then ' Считаем пробелы gap = gap + 1 ' один да один - два
ElseIf cursign = chr(10) Or cursign = chr(9) Then ' Считаем переносы строк break = break + 1 End If
Next msgbox "Всего знаков: " & Len(letters) - break & chr(13) & "Знаков без пробелов: " & Len(letters) - gap - break
End Sub =========================== скопипастить выше =================================
5. Файл->Сохранить/Закрыть 6. Теперь вставь текст в Writer, выдели его (Ctrl+A). Сервис->Макросы->Выполнить макрос 7. В "Библиотека"->Standart->lettercounter(Main)-> Выполнить Если есть необходимость, то макрос через Сервис-Настройки выносится на панель. Ему присваивается понятное имя и значок. Работает хорошо, единственное, для того, чтобы подсчитать количество символов, необходимо выделить кусок текста. Ну, или весь текст. 
|
|
|
|
|
Записан
|
|
|
|
|
lemonjoe
|
 |
« Ответ #9 : 13 Ноября 2009, 01:01 » |
|
Да, еще забыл отметить: количество знаков в таблицах не считает. Если кто-нибудь сможет усовершенствовать макрос, его автор был бы только рад. 
|
|
|
|
« Последнее редактирование: 13 Ноября 2009, 01:04 от lemonjoe »
|
Записан
|
|
|
|
|
фывао
Гость
|
 |
« Ответ #10 : 13 Ноября 2009, 02:01 » |
|
Так работает везде: Sub Main Dok = ThisComponent Poisk = Dok.createSearchDescriptor Poisk.SearchRegularExpression = TRUE Poisk.SearchString = "$" 'абзацы A = Dok.findAll(Poisk).Count Poisk.SearchString = "\n" 'обрыв строки B = Dok.findAll(Poisk).Count Poisk.SearchString = "\t" 'табуляция C = Dok.findAll(Poisk).Count Poisk.SearchString = " " 'пробел D = Dok.findAll(Poisk).Count p = chr(13) msgbox cStr(A)+ " - абзацы "+p+cStr(B)+ " - обрывы строки "+p+cStr(C)+ " - табуляции "+p+cStr(D)+ " - пробелы " , 64 End Sub Можно также из общего числа символов (которое можно либо сосчитать тем же способом что и выше, либо взять сразу Dok.CharacterCount) вычесть число пробелов.
|
|
|
|
|
Записан
|
|
|
|
|
Федор
|
 |
« Ответ #11 : 14 Ноября 2009, 08:57 » |
|
А кто-нибудь может скрестить оба макроса? К сожалению, я не умею программировать.
|
|
|
|
|
Записан
|
|
|
|
|
фывао
Гость
|
 |
« Ответ #12 : 14 Ноября 2009, 10:31 » |
|
Sub Main Dok = ThisComponent Poisk = Dok.createSearchDescriptor Poisk.SearchRegularExpression = TRUE Poisk.SearchString = "$" 'абзацы A = Dok.findAll(Poisk).Count Poisk.SearchString = "\n" 'обрыв строки B = Dok.findAll(Poisk).Count Poisk.SearchString = "\t" 'табуляция C = Dok.findAll(Poisk).Count Poisk.SearchString = " " 'пробел D = Dok.findAll(Poisk).Count p = chr(13) E = Dok.CharacterCount 'всего символов msgbox cStr(E)+ " - всего символов "+p+cStr(E-D)+ " - символов без пробелов "+p+cStr(A)+ " - абзацы "+p+cStr(B)+ " - обрывы строки "+p+cStr(C)+ " - табуляции "+p+cStr(D)+ " - пробелы " , 64 End Sub
|
|
|
|
|
Записан
|
|
|
|
|
lemonjoe
|
 |
« Ответ #13 : 14 Ноября 2009, 13:20 » |
|
фывао, ваш макрос не считает выделенную часть документа.  К сожалению.
|
|
|
|
|
Записан
|
|
|
|
|
фывао
Гость
|
 |
« Ответ #14 : 14 Ноября 2009, 13:32 » |
|
Тогда вот: Sub Main Dok = ThisComponent Poisk = Dok.createSearchDescriptor Poisk.SearchRegularExpression = TRUE Poisk.SearchAll = FALSE Poisk.SearchString = "$" 'абзацы A = Dok.findAll(Poisk).Count Poisk.SearchString = "\n" 'обрыв строки B = Dok.findAll(Poisk).Count Poisk.SearchString = "\t" 'табуляция C = Dok.findAll(Poisk).Count Poisk.SearchString = " " 'пробел D = Dok.findAll(Poisk).Count p = chr(13) Poisk.SearchString = "." 'все символы E = Dok.findAll(Poisk).Count 'всего символов msgbox cStr(E)+ " - всего символов "+p+cStr(E-D)+ " - символов без пробелов "+p+cStr(A)+ " - абзацы "+p+cStr(B)+ " - обрывы строки "+p+cStr(C)+ " - табуляции "+p+cStr(D)+ " - пробелы " , 64 End Sub
|
|
|
|
|
Записан
|
|
|
|
smaharbA
Участник
 
Offline
Сообщений: 341
Откуда: Екатеринбург
|
 |
« Ответ #15 : 14 Ноября 2009, 14:04 » |
|
колонтитулы и прочие блоки и врезки как считать ?
|
|
|
|
|
Записан
|
|
|
|
|
фывао
Гость
|
 |
« Ответ #16 : 14 Ноября 2009, 14:11 » |
|
Не знаю... Последний вариант тоже не считает символы в выделенном тексте, несмотря на SearchAll=FALSE (как этим пользоваться?). Тогда вот вариант. Sub Main document = ThisComponent.CurrentController.Frame dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array()) NDok = StarDesktop.loadComponentFromURL( "private:factory/swriter", "_blank", 0, Array()) Ndocument = NDok.CurrentController.Frame Dim args1(0) as new com.sun.star.beans.PropertyValue args1(0).Name = "SelectedFormat" args1(0).Value = 1 dispatcher.executeDispatch(Ndocument, ".uno:ClipboardFormatItems", "", 0, args1())
Poisk = NDok.createSearchDescriptor Poisk.SearchRegularExpression = TRUE Poisk.SearchString = "$" 'абзацы A = NDok.findAll(Poisk).Count Poisk.SearchString = "\n" 'обрыв строки B = NDok.findAll(Poisk).Count Poisk.SearchString = "\t" 'табуляция C = NDok.findAll(Poisk).Count Poisk.SearchString = " " 'пробел D = NDok.findAll(Poisk).Count p = chr(13) E = NDok.CharacterCount 'всего символов msgbox cStr(E)+ " - всего символов "+p+cStr(E-D)+ " - символов без пробелов "+p+cStr(A)+ " - абзацы "+p+cStr(B)+ " - обрывы строки "+p+cStr(C)+ " - табуляции "+p+cStr(D)+ " - пробелы " , 64 NDok.setModified(FALSE) NDok.close(TRUE) End Sub
|
|
|
|
|
Записан
|
|
|
|
|
фывао
Гость
|
 |
« Ответ #17 : 14 Ноября 2009, 16:37 » |
|
Вот ещё вариант, который работает с выделенным текстом (правда, выделен должен быть один участок, а иначе символы будут сосчитаны от начала первого до конца последнего). Dim Dok, Tx, Poisk, VK As Object
Sub Main Dok = ThisComponent Tx = Dok.Text Poisk = Dok.createSearchDescriptor Poisk.SearchRegularExpression = TRUE VK = Dok.CurrentController.ViewCursor ' Poisk.SearchString = "\t" 'табуляция ' C = PoiskV Poisk.SearchString = " " 'пробел D = PoiskV Poisk.SearchString = "." 'все символы E = PoiskV 'всего символов p = chr(13) msgbox cStr(E)+ " - всего символов "+p+cStr(E-D)+ " - символов без пробелов " , 64 '+p+cStr(C) + " - табуляции " , 64 End Sub '------------------------------------------------------ Function PoiskV As Integer Dim k As Integer oT = Tx.createTextCursorByRange(VK.Start,FALSE) oK = Tx.createTextCursorByRange(VK.End,FALSE) oT = Dok.findNext(oT.End, Poisk) If isNull(oT) then PoiskV=0 Exit Function Endif While not isNull(oT) and Tx.compareRegionEnds(oT,oK)>0 oT = Dok.findNext(oT.End, Poisk) k=k+1 Wend PoiskV=k End Function
|
|
|
|
« Последнее редактирование: 14 Ноября 2009, 17:04 от фывао »
|
Записан
|
|
|
|
smaharbA
Участник
 
Offline
Сообщений: 341
Откуда: Екатеринбург
|
 |
« Ответ #18 : 14 Ноября 2009, 17:26 » |
|
а чем плох найти+заменить ?
|
|
|
|
|
Записан
|
|
|
|
smaharbA
Участник
 
Offline
Сообщений: 341
Откуда: Екатеринбург
|
 |
« Ответ #19 : 14 Ноября 2009, 17:28 » |
|
по поводу выделенного - селект это объект и в нем можно искать все
|
|
|
|
|
Записан
|
|
|
|
|
Федор
|
 |
« Ответ #20 : 14 Ноября 2009, 17:38 » |
|
Если в документе только текст, то все гут. Если еще и таблица или просто в таблице, то:
Ошибка времени выпoлнeния BASIC. Вызвано исключение Type: com.sun.star.lang.IllegalArgumentExceptIOn Message: .
Это я о последнем коде.
Код в 12-ом посте (без выделения) работает как часы. В принципе, количество знаков в выделении мне нужно очень редко. Так что огромное спасибо, уже использую.
|
|
|
|
« Последнее редактирование: 14 Ноября 2009, 17:42 от Федор »
|
Записан
|
|
|
|
smaharbA
Участник
 
Offline
Сообщений: 341
Откуда: Екатеринбург
|
 |
« Ответ #21 : 14 Ноября 2009, 17:49 » |
|
есть чарсетС, конечно в МСО несколько иначе, но и тут есть
|
|
|
|
|
Записан
|
|
|
|
|
фывао
Гость
|
 |
« Ответ #22 : 14 Ноября 2009, 18:32 » |
|
smaharbA, если есть немного времени, помогите разобраться, пожалуйста. Вот по теме: http://www.oooforum.org/forum/viewtopic.phtml?t=40529&highlight=searchall+selectionПочему-то не работает макрос, который приведён на том же форуме: http://www.oooforum.org/forum/viewtopic.phtml?t=20103&highlight=replaceall+selection (точнее, работает, но если искать абзацы - то не работает). Ещё тут пример: http://www.pitonyak.org/AndrewMacro.odt пункт 7.14.2) В общем, всё что у меня получилось - выше приведено, и больше ничего не могу.
|
|
|
|
« Последнее редактирование: 14 Ноября 2009, 18:35 от фывао »
|
Записан
|
|
|
|
smaharbA
Участник
 
Offline
Сообщений: 341
Откуда: Екатеринбург
|
 |
« Ответ #23 : 14 Ноября 2009, 18:54 » |
|
т.е. не работает ? P = ThisComponent.createSearchDescriptor P.SearchRegularExpression = TRUE P.SearchString = "$" msgbox ThisComponent.findAll(p).count
в целом мене ООо интересен только для флуда ))) (правдо) (и несколько из насколько то профессионального интереса, он есть как печатная машинка на некоторых (ранее на привелигирующих) машинках) не поддерживаемое мнение мое - конструктора объектности ООо злоупотребляют анашой (холивар) ))) в данное время не имею возможности обдумать проблему (правдо вот после такого - должны сказать - пустобрех  )
|
|
|
|
« Последнее редактирование: 14 Ноября 2009, 19:03 от smaharbA »
|
Записан
|
|
|
|
|
Федор
|
 |
« Ответ #24 : 14 Ноября 2009, 19:17 » |
|
Что такое "привелигирующих". Вообще, о чем был предыдущий пост? У нас язык общения русский или я не по адресу попал? Почему каким-то диким белым стихом? Все же, кто может выложить код, работающий для выделения без ошибки?
|
|
|
|
|
Записан
|
|
|
|
smaharbA
Участник
 
Offline
Сообщений: 341
Откуда: Екатеринбург
|
 |
« Ответ #25 : 14 Ноября 2009, 19:49 » |
|
зачем ?
|
|
|
|
|
Записан
|
|
|
|
|
Федор
|
 |
« Ответ #26 : 14 Ноября 2009, 21:16 » |
|
Заканчивай флуд, остроумный.
|
|
|
|
|
Записан
|
|
|
|
Nick
Administrator
Участник
 
Offline
Сообщений: 1971
Откуда: Россия, Москва
Николай Гарбуз
|
 |
« Ответ #27 : 14 Ноября 2009, 22:06 » |
|
2 Федор:
smaharbA часто страдает неадекватной реакцией и ответами не в тему. Не обращайте на него внимания.
|
|
|
|
|
Записан
|
|
|
|
Nick
Administrator
Участник
 
Offline
Сообщений: 1971
Откуда: Россия, Москва
Николай Гарбуз
|
 |
« Ответ #28 : 14 Ноября 2009, 22:07 » |
|
зачем ?
Когда говоришь, что думаешь, думай, что говоришь!
|
|
|
|
|
Записан
|
|
|
|
smaharbA
Участник
 
Offline
Сообщений: 341
Откуда: Екатеринбург
|
 |
« Ответ #29 : 15 Ноября 2009, 10:49 » |
|
Nick - хоть один ответ не по теме Вы лично встречали ? Другое дело в понимании
|
|
|
|
|
Записан
|
|
|
|
|