У меня есть столбец строк, пример ниже. Каждая строка представляет собой комбинацию текстов с разделителями. Каждая строка имеет разное количество текстов. Я хочу создать один столбец с одним текстом в строке на основе этого столбца.
ИЗ:
a;b
x;y;z
p;q;r;s;t
К:
a
b
x
y
z
p
q
r
s
t
Как мне добиться этого, используя одну формулу?
Я пробовал TRANSPOSE(TEXTSPLIT(TEXTJOIN(";",TRUE, data),";"))
Однако это не удается, поскольку часть TEXTJOIN содержит более 32767 символов.
Я также попытался построить двумерный массив mxn, где m=no. строк в исходных данных и n=нет. текстов. Однако MAKEARRAY по-прежнему приводит к одному столбцу. Если бы это сработало, я бы использовал TOCOL или что-то подобное для преобразования в один столбец.
=MAKEARRAY(ROWS(data),COLUMNS(MAX(num_of_texts_in_each_row)), LAMBDA(r,c, LET(
drow, INDEX(data,r,1),
splits, TEXTSPLIT(drow,";"),
INDEX(splits,,c)
)))
Спасибо!! это была ошибка, и она решила всю проблему, когда я ее удалил.
Использовать:
=LET(
rng,A1:A3,
clm,MAX(BYROW(rng,LAMBDA(a,COUNTA(TEXTSPLIT(a,";"))))),
TOCOL(MAKEARRAY(ROWS(rng),clm,LAMBDA(a,b,INDEX(TEXTSPLIT(INDEX(A1:A3,a),";"),b))),3))
спасибо, это именно то, что я пытался, но сделал небольшую ошибку.
Другой подход заключается в использовании REDUCE:
=DROP(REDUCE(0,A1:A3,LAMBDA(a,b,VSTACK(a,TEXTSPLIT(b,,";")))),1)
REDUCE ведет себя как BYROW, где VSTACK укладывает полученный результат для каждой строки друг над другом после полного значения сброса. Поскольку оно начинается с 0, мы используем DROP первое значение, чтобы получить желаемый результат.
Мы также могли бы избежать DROP, но это делает формулу более сложной и длинной, но для справки:
=REDUCE(TEXTSPLIT(A1,,";"),A2:A3,LAMBDA(a,b,VSTACK(a,TEXTSPLIT(b,,";"))))
Фантастический. Спасибо! Я надеялся, что REDUCE сделает это, но моя версия Excel только что получила REDUCE несколько дней назад и не испытала достаточного опыта.
Это очень полезно. Посмотрите, что произойдет, если вы измените VSTACK на HSTACK и завернете его в IFERROR: =IFERROR(DROP(REDUCE(A1,A1:A3,LAMBDA(a,b,VSTACK(a,TEXTSPLIT(b,";")))),1),"")
Качественный товар. Я начинаю думать, что REDUCE
быстро становится новой функцией выбора: она может имитировать, например, BYROW
, как вы показали здесь, и, что более важно, ее встроенная псевдорекурсивная природа также может дать ей отличительное преимущество перед другими новыми функциями во многих ситуациях.
Сказав это, я должен сказать, что я немного разочарован в MS из-за того, что такие функции, как TEXTSPLIT
, не могут генерировать массив возвратов.
Я думал так же, но думаю, это потому, что TEXTSPLIT имеет два условия для разбиения: по строке и/или по столбцу. Таким образом, сама формула будет генерировать двумерный массив. Наверное, поэтому. Я бы ожидал, что он будет работать в сочетании с BYROW, если вы хотите разбить результат разделения текста по горизонтали по строке, но в этом случае REDUCE, кажется, перехитрил BYROW
Хорошая мысль относительно двух аргументов-разделителей. Возможно, MS могла бы сделать это необязательным, т. е. вы можете указать одномерную версию функции, чтобы она генерировала массив возвратов при передаче диапазона из более чем одной ячейки.
Почему там КОЛОННЫ?