Перебрать столбец и выполнить vstack к новому отдельному столбцу, используя формулу

У меня есть столбец строк, пример ниже. Каждая строка представляет собой комбинацию текстов с разделителями. Каждая строка имеет разное количество текстов. Я хочу создать один столбец с одним текстом в строке на основе этого столбца.

ИЗ:

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)
)))

Почему там КОЛОННЫ?

Rory 17.11.2022 17:08

Спасибо!! это была ошибка, и она решила всю проблему, когда я ее удалил.

dsauce 17.11.2022 17:25
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
2
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Использовать:

=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))

спасибо, это именно то, что я пытался, но сделал небольшую ошибку.

dsauce 17.11.2022 17:25
Ответ принят как подходящий

Другой подход заключается в использовании 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 несколько дней назад и не испытала достаточного опыта.

dsauce 17.11.2022 20:38

Это очень полезно. Посмотрите, что произойдет, если вы измените VSTACK на HSTACK и завернете его в IFERROR: =IFERROR(DROP(REDUCE(A1,A1:A3,LAMBDA(a,b,VSTACK(a,TEXTSPLIT(‌​b,";")))),1),"")

P.b 17.11.2022 20:44

Качественный товар. Я начинаю думать, что REDUCE быстро становится новой функцией выбора: она может имитировать, например, BYROW, как вы показали здесь, и, что более важно, ее встроенная псевдорекурсивная природа также может дать ей отличительное преимущество перед другими новыми функциями во многих ситуациях.

Jos Woolley 17.11.2022 20:46

Сказав это, я должен сказать, что я немного разочарован в MS из-за того, что такие функции, как TEXTSPLIT, не могут генерировать массив возвратов.

Jos Woolley 17.11.2022 20:50

Я думал так же, но думаю, это потому, что TEXTSPLIT имеет два условия для разбиения: по строке и/или по столбцу. Таким образом, сама формула будет генерировать двумерный массив. Наверное, поэтому. Я бы ожидал, что он будет работать в сочетании с BYROW, если вы хотите разбить результат разделения текста по горизонтали по строке, но в этом случае REDUCE, кажется, перехитрил BYROW

P.b 17.11.2022 21:01

Хорошая мысль относительно двух аргументов-разделителей. Возможно, MS могла бы сделать это необязательным, т. е. вы можете указать одномерную версию функции, чтобы она генерировала массив возвратов при передаче диапазона из более чем одной ячейки.

Jos Woolley 17.11.2022 21:15

Другие вопросы по теме