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

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

22 Апрель 2021, 22:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1 2 »   Вниз
  Печать  
Автор Тема: Число повторений определенного слова в ячейке  (Прочитано 965 раз)
0 Пользователей и 1 Гость смотрят эту тему.
radius
Форумчанин
***
Offline Offline

Сообщений: 58


« Стартовое сообщение: 19 Март 2021, 12:04 »

Какой формулой можно подсчитать число повторений определенного слова в ячейке?
Записан
economist
Форумчанин
***
Offline Offline

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


« Ответ #1: 19 Март 2021, 12:24 »

Читаю "определенного" как "нескольких определенных", поэтому сразу предлагаю полное решение:
- Текст по столбцам (слова вытянутся вправо)
- Транспонировать в столбец A (слова вытянутся вниз), именовать диапазон - "СЛОВА".
- Вставить 5 строк вверху и Расширенный фильтр - Только уникальные
- В первой уникальной строке - написать формула вида =СЧЁТЕСЛИ(СЛОВА;A5)
- Протянуть формулу вниз
- Получим  список всех уникальных слов и число их повторов.

Ежли слово и правда одно, то подстроку в строке ищет функция =НАЙТИ() и ПОИСК(), а чтобы найти число вхождений (если их немного) - можно их вложить функцию N раз для поиска N-го вхождения.

Можно использовать крайне быстрые и изощренные строковые методы Python в Calc, сведя задачу к:

'а б в а г д в а'.count('а') # = 3

UPD: После установки расширения pystring.oxt - в Calc можно писать такие формулы:

Код:
=PYSTRING("count";"тут много много слов";"слов")
=PYSTRING("count";A1;B1)

Помимо count реализовано еще 50 методов: изм. регистра, поиск, реверс, транслит, разбивка, партицирование итд. Расширение и примеры тут:   

https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=83856&p=389632
« Последнее редактирование: 19 Март 2021, 13:12 от economist » Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 515



« Ответ #2: 19 Март 2021, 12:30 »

Или реализовать макрос
=COUNT_WORDS(Текст;Слово)

Можно воспользоваться методикой "заменить – сравнить длину"
https://www.ablebits.com/office-addins-blog/2016/06/16/how-to-count-words-excel/
Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
radius
Форумчанин
***
Offline Offline

Сообщений: 58


« Ответ #3: 19 Март 2021, 12:31 »

Спасибо, узнал много нового, буду пробовать
Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 3 068


iMac, LibreOffice и Apache OpenOffice


« Ответ #4: 19 Март 2021, 12:41 »

Формулой:
Код:
=(LEN(A1)-LEN(SUBSTITUTE(A1;B1;"")))/LEN(B1)
или
Код:
=(ДЛСТР(A1)-ДЛСТР(ПОДСТАВИТЬ(A1;B1;"")))/ДЛСТР(B1)
Записан

eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 515



« Ответ #5: 19 Март 2021, 12:48 »

По смыслу предложенной мной ссылки… но можно реализовать это чуть иначе:

Используем REGEX(РЕГВ), далее навскидку со смартфона:

A1="Текст из слов"
A2="Слово"
A3=REGEX(A1;"(?i)\b"&A2&"\b";"";"g")

A4=(LEN(A1)-LEN(A3))/LEN(A2)

UPD
Комментарий. Принцип тот же, как и у @rami
Регулярное выражение означает:
(?i)  без учёта регистра символов
\b  граница слова, в выражении этих границ – 2: до и после; "boundary" означает "граница"

Параметр функции "g" (по умолчанию) – глобальная замена по всему тексту всех слов на пустую строку (см. третий аргумент функции).


Вычитаем из длины исходного текста длину полученного (уже без слов), не забывая разделить результат на длину слова, и получаем количество слов.

В тексте: "Да, да, продано давно!" – найдём количество слов "да".
Мой вариант найдёт только два слова (и это первые два слова), формула от @rami, похоже, найдёт 4… нет 3 (с учётом регистра).
« Последнее редактирование: 19 Март 2021, 13:24 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 515



« Ответ #6: 19 Март 2021, 13:32 »

А если по существу вопроса, то формула @rami и проще, и её, как правило, должно хватать.
Данные в поле (ячейке) должны быть атомарными, то есть неделимыми.
Усложнённая обработка текста косвенно свидетельствуют о том, что хранение ваших данных в таблице организовано неправильно.
Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
radius
Форумчанин
***
Offline Offline

Сообщений: 58


« Ответ #7: 19 Март 2021, 15:02 »

Код:
=(LEN(A1)-LEN(SUBSTITUTE(A1;B1;"")))/LEN(B1)

Спасибо, получилось
Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 3 068


iMac, LibreOffice и Apache OpenOffice


« Ответ #8: 19 Март 2021, 16:36 »

Протестируйте формулу на всех возможных вариантах данных, в некоторых случаях вы можете получить не тот результат что хотите. Если нужно учитывать только целые слова, то "SUBSTITUTE()", нужно заменить на "REGEX()" (как предложил eeigor).
Записан

radius
Форумчанин
***
Offline Offline

Сообщений: 58


« Ответ #9: 20 Март 2021, 18:28 »

Странно, SUBSTITUTE работает REGEX - нет. Файл прилагаю.
 

* SUBSTITUTE.ods (13.7 Кб - загружено 6 раз.)
Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 3 068


iMac, LibreOffice и Apache OpenOffice


« Ответ #10: 20 Март 2021, 19:17 »

Функция REGEX появилась в LibreOffice 6.2. Если ваш офис новее, то должна работать следующая формула (для ячейки C2):
Код:
=(LEN(A2)-LEN(REGEX(A2;"(?i)\b" & D2 & "\b";"";"g")))/LEN(D2)
Записан

radius
Форумчанин
***
Offline Offline

Сообщений: 58


« Ответ #11: 20 Март 2021, 19:20 »

Да, заработало как надо, спасибо. Офис 7.0.1.2
Записан
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 515



« Ответ #12: 20 Март 2021, 22:58 »

@radius, а такое выражение
(?i)\b(\w+)\b.*?\b\1\b
выявит все проблемные строки, в которых любое слово повторяется хотя бы один раз.

Но вы не говорите нам, что вы там отлавливаете... Улыбка
К сожалению, выражение выше не работает как надо, если границы слова тоже заключить в группу, чтобы не дублировать их при обратной ссылке. Поэтому так.
« Последнее редактирование: 20 Март 2021, 23:03 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
radius
Форумчанин
***
Offline Offline

Сообщений: 58


« Ответ #13: 21 Март 2021, 06:57 »

Да, отлавливаю слова, дублирующиеся несколько раз в одной ячейке (в подавляющем большинстве - дважды). Таблица примерно 40000 строк, в каждой ячейке не более 350 символов. Пока планирую использовать сначала вот этот способ https://forumooo.ru/index.php/topic,7420.0/msg,48962.html , путем некоторых манипуляций найду самые часто повторяющиеся слова, затем при помощи формулы из этой темы отфильтровывать строки в которых конкретное слово повторяется 2 и более раза и вручную править. От ручной правки не уйти.
Записан
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 515



« Ответ #14: 21 Март 2021, 11:49 »

А в чём содержание правок и почему вручную? Объём приличный… Текст конфидециальный?
Распишите подробнее, что-нибудь предложим
« Последнее редактирование: 21 Март 2021, 11:55 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
Страниц: 1 2 »   Вверх
  Печать  
 
Перейти в:  

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