У меня есть столбец строк в следующем формате:
Xxx, yyy, zzz, Need this|AAA, BBB, CCC, And this|Xxx, BBB, CCC, This too...
Число "|" разделители не указаны и различаются в каждой ячейке столбца. Для каждой строки мне нужно извлечь список текста между | разделитель и предшествующая ему запятая.
Я нашел, как получить каждый из них по отдельности:
=TEXTAFTER(TEXTBEFORE(cellvalue,"|",", ",-1))
Однако я не уверен, как перебирать разделители X в каждой ячейке, чтобы получить список текста перед каждым разделителем. Я бы хотел, чтобы эти значения находились в списке по одной ячейке в каждой строке, разделенной разделителем.
Бонус, если вы можете добавить метод, чтобы сделать список только уникальными значениями!
Понимаю, что с другой программой это было бы проще, но я могу работать только с Excel :)
Вы могли бы попробовать что-то вроде этого:
=TEXTJOIN(CHAR(10),1,TEXTAFTER(TEXTSPLIT(A1,,"|"),", ",-1))
Чтобы были только уникальные:
=TEXTJOIN(CHAR(10),1,UNIQUE(TEXTAFTER(TEXTSPLIT(A1,,"|"),", ",-1)))
NOTE: I have used line-feeds as delimiter to join( remember to click on wrap text from Home
Ribbon), one can use comma ,
or semi-colons ;
as well or any other as per their suit.
Если у вас есть диапазон данных, как показано ниже, оберните приведенное выше вспомогательной функцией LAMBDA()
, например BYROW()
или MAP()
, но я предпочитаю использовать опцию копирования вниз, поскольку функции TEXTJOIN()
или ARRAYTOTEXT()
имеют ограничения по количеству символов, однако, возможно, ваши записи будут все же будьте в пределах дозволенного.
=MAP(A1:A9,LAMBDA(α,
TEXTJOIN("; ",1,UNIQUE(TEXTAFTER(
TEXTSPLIT(α,,"|"),", ",-1)))))
Ради интереса и, если возможно, попробуйте использовать REGEXREPLACE()
:
Формула в C1
:
=REGEXREPLACE(A1:A3,"([^,|]+)(,\s*(?1))*(?=(?2))(((?2))\|(?=.*\4(\||$)))?,?\s*",)
Они такие веселые @nkalvi. На моей странице ☕ есть несколько интересных советов.
Берем последний столбец после разделения по столбцу (,
) и строке (|
):
A1:INDEX(A:A, COUNTA(A:A))
для автоматического расширения записей, добавленных позже.
=BYROW(
A1:INDEX(A:A, COUNTA(A:A)),
LAMBDA(row_,
TEXTJOIN(
CHAR(10),
,
UNIQUE(TAKE(TEXTSPLIT(row_, ",", "|", FALSE, , ""), , -1))
)
)
)
РЕГИСТРАЦИОННОЕ ВЫРАЖЕНИЕ
Посмотрите вперед на |
или конец строки (?=(\||$))
, затем найдите ,
с помощью (?<=,)
и соберите любой символ *
, но [^,|]
, собрав все совпадения с REGEXEXTRACT(,,1)
:
=BYROW(
A1:A4,
LAMBDA(r,
TEXTJOIN(
REPT(CHAR(10), 2),
,
UNIQUE(REGEXEXTRACT(r, "(?<=,)[^,|]*(?=(\||$))", 1))
)
)
)
Спасибо за добавление параметров регулярных выражений, теперь, когда я присоединился к «инсайдерам», я могу протестировать их на Mac;)