Строку в массив

Автор TanaTiX, 9 марта 2022, 12:04

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

TanaTiX

Есть в ячейке текст, который нужно разделить, используя "разделитель". В гугл-таблицах для этого есть замечательная функция split (стоит русскоязычная версия либры, но уже вроде все допустимые функции пересмотрел - не нашел). Как мне, не прибегая к программированию (результат должен считаться на лету в ячейке), получить массив значений после разделения строки?
Пример:
Строку вида "111щ222щ333щ555" нужно преобразовать в массив, что бы затем с помощью ИНДЕКС иметь доступ к 111, 222, 333 или 555.
Заранее спасибо.

mikekaganski

#1
Цитата: TanaTiX от  9 марта 2022, 12:04что бы затем с помощью ИНДЕКС иметь доступ к 111, 222, 333 или 555
Никак. Однако можно использовать REGEX для того же - сразу указывая индекс в вызове (я использую английское имя функции; при желании это можно включить в настройках).

=REGEX("111щ222щ333щ555";"(?<=^|щ)[^щ]*(?=щ|$)";;2)

даст 222, то есть второе вхождение (в соответствии с четвёртым аргументом).
С уважением,
Михаил Каганский

eeigor

#2
Вы можете вместо номера извлекаемого вхождения сослаться в формуле на ячейку в строке выше и протянуть формулу вправо. Ячейки заполнятся соответствующим вхождением. Формула ИНДЕКС не нужна.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Для коллекции - можно и "обычными" функциями (как и в Excel). Помещаем в A1 текст "111щ222щ333щ555", в B1 помещаем формулу
=СЖПРОБЕЛЫ(ПСТР(ПОДСТАВИТЬ($A$1;"щ";ПОВТОР(" ";100));СТРОКА(B1)*100-99;100))
и "протягиваем" формулу вниз.
Владимир.

bigor

Для полноты коллекции можно и текст по столбцам, с разделителем "щ" :) Хотя насколько это
Цитата: TanaTiX от  9 марта 2022, 12:04считаться на лету в ячейке
судить тс
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

TanaTiX

mikekaganski, спасибо. Работает супер, хотя и предполагал решение покороче. Но на безрыбье...
Теперь осталось, что бы регулярки работали на рабочем компе со "странным" линуксом.

sokol92

Цитата: TanaTiX от  9 марта 2022, 16:05рабочем компе со "странным" линуксом.
Какую конкретно версию OC и LO вы имеете в виду?
Владимир.

TanaTiX

sokol92, на одном из компов стоит РОСА с версией 5.х (точно не помню)
Буквально вчера сисадмиину отправил типа заявки на обновление версии, но осилит ли - хз.

eeigor

Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

Цитата: TanaTiX от  9 марта 2022, 16:05хотя и предполагал решение покороче

Регулярка покороче - "(?<=^|щ)[^щ]*". Хотелось бы, чтобы работала простая регулярка "[^щ]*", но tdf#147875.
С уважением,
Михаил Каганский

Tigrik

Цитата: mikekaganski от  9 марта 2022, 12:15я использую английское имя функции
- а есть ли такое, но с перламутровыми пуговицами русско-язычное.

mikekaganski

Я надеюсь, что нет. Ужасно пытаться разобраться, что такое эти "СМЕЩ", "ОБЪЕДИНИТЬ", "СЦЕПИТЬ", "СОВПАД", "ЕОШИБКА". Но мнения разнятся, economist меня не поддержит. Если очень нужно - обращайтесь к bormant.
С уважением,
Михаил Каганский

Tigrik

Цитата: mikekaganski от  9 марта 2022, 19:39Я надеюсь, что нет.
Жаль. «Будем искать...»

Спасибо.

eeigor

#13
Цитата: mikekaganski от  9 марта 2022, 17:51но tdf#147875
A1: =REGEX("111;;222;333;555";"[^;]+";;ROW())
даст нужный результат.
Квантификатор * допускает пустую строку однако (и правильно, вроде бы, когда функция их находит, но есть "но").

Мой опыт показывает (demo code):
 oTextSearch = CreateUnoService("com.sun.star.util.TextSearch")
 oOptions = CreateUnoStruct("com.sun.star.util.SearchOptions")
 oOptions.algorithmType = com.sun.star.util.SearchAlgorithms.REGEXP
 oOptions.searchString = sPattern  'regex
 oTextSearch.setOptions(oOptions)
 <...>
 aSearchResult = oTextSearch.searchForward(sText, 0, Len(sText))

Метод searchForward все пустые regex-строки (к примеру из выражения выше) "добросовестно" пропустит. Как же так? В смысле: должно быть "безобразно, но однообразно". Пусть это удобно: не надо пропускать пустые строки, но не более того (ибо эту задачу вполне можно было возложить на программиста).
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Цитата: mikekaganski от  9 марта 2022, 19:39Ужасно пытаться разобраться, что такое эти "СМЕЩ", "ОБЪЕДИНИТЬ", "СЦЕПИТЬ", "СОВПАД", "ЕОШИБКА".
У меня есть такая таблица для функций Excel. Для Calc тоже может пригодиться. Указанные выше функции находятся.  :)
Владимир.