TEXTSPLIT в сочетании с BYROW возвращает неожиданный результат при использовании массива строк в качестве входных данных

Я тестирую следующий простой случай:

=LET(input, {"a,b;c,d;" ; "e,d;f,g;"},
  BYROW(input, LAMBDA(item, TEXTJOIN(";",,TEXTSPLIT(item,",",";", TRUE)))))

так как TEXTJOIN является обратной операцией TEXTSPLIT, вывод должен быть таким же, как input без последнего ;, но это не работает так.

Если я попытаюсь использовать диапазон, он сработает:

Он работает для одной строки:

=LET(input, "a,b;c,d;", TEXTJOIN(";",,TEXTSPLIT(input,",",";", TRUE)))

он возвращает: a,b;c,d

Что я здесь делаю неправильно? Я думаю, что это может быть ошибка. В документации TEXTSPLIT нет ограничений на использование TEXTSPLIT в сочетании с BYROW при использовании массива строк.

REDUCE() может сделать этот трюк. Смотрите этот пост. stackoverflow.com/questions/73852522/…
Harun24hr 11.11.2022 03:14

Хорошая идея, чтобы преодолеть это, но зачем нам это нужно? Мне не удалось найти никакой документации, объясняющей, что использовать BYROW невозможно. Да, ваш подход работает: =LET(input, {"a,b;c,d;";"e,d;f,g;"},DROP(REDUCE("", input, LAMBDA(acc,x, VSTACK(acc, TEXTJOIN(";",,TEXTSPLIT(x,",",";", TRUE))))),1)). Я не думаю, что смогу использовать его в своем реальном примере, потому что ввод представляет собой одну строку, которая генерирует массив.

David Leal 11.11.2022 03:35

Я смог заставить его работать в реальном примере, но все же мне непонятно, почему он не работает с BYROW.

David Leal 11.11.2022 04:11

Интересный. Похоже, ваш выбор точек с запятой и запятых в строке неудачен: замена их другими символами работает нормально, например LET(input,{"a|b\c|d\";"e|d\f|g\"}. Поскольку выбранные вами символы совпадают с разделителями строк/столбцов в англоязычных версиях Excel, я могу только предположить, что происходит какая-то ошибочная внутренняя неверная интерпретация этих символов как разделителей строк/столбцов.

Jos Woolley 11.11.2022 06:36

Я думаю, что это та же проблема, что описана здесь: stackoverflow.com/a/73886031/16578424 — см. последний комментарий Скотта Крамера. Но почему бы вам не использовать: =LET(input,{"a,b;c,d;";"e,d;f,g;"}, replaced,SUBSTITUTE(input,",",";"), LEFT(replaced,LEN(replaced)-1))

Ike 11.11.2022 08:51

@Ike Я пытался изолировать проблему от другой проблемы. Сам образец бесполезен, потому что он возвращает почти то же самое, что и ввод. Единственная цель — показать проблему, с которой я столкнулся в других ситуациях.

David Leal 11.11.2022 14:58

@JosWoolley Я проверил: =LET(input, {"a|b\c|d\";"e|d\f|g\"}, BYROW(input, LAMBDA(item, TEXTJOIN("\",,TEXTSPLIT(item,"|","\", TRUE))))) и это не работает, тот же результат. Если вы меняете разделители в input, вам нужно изменить их и в TEXTJOIN, и в TEXTSPLIT тоже. Обходной путь, который работает, указан @JvdV в его ответе.

David Leal 12.11.2022 01:16
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
4
7
190
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не уверен, что это будет классифицироваться как ответ, но решил поделиться своей попыткой.

Я не думаю, что проблема здесь TEXTSPLIT(). Я пробовал разные вещи. Во-первых, я попытался включить FILTERXML(), чтобы сделать сплит, с точно таким же результатом. На всякий случай:

=BYROW({"a,b;c,d;","e,d;f,g;"},LAMBDA(item,TEXTJOIN(";",,FILTERXML("<t><s>"&SUBSTITUTE(SUBSTITUTE(item,",",";"),";","</s><s>")&"</s></t>","//s"))))

Затем я попытался принудительно использовать массив с помощью T(IF(1,TEXTSPLIT("a,b;c,d;",{",",";"},,1))), но Excel не сдвинулся с места.

Вышеизложенное заставило меня поверить, что проблема на самом деле в самой BYROW(). Несмотря на то, что в документации говорится, что 1-й параметр принимает массив, работа с другими функциями массива кажется ошибочной, и вы можете сообщить об этом как таковой.


Для чего это стоит сейчас; вы можете использовать REDUCE(), как указано в комментариях и в связанном ответе, однако я бы сохранил это для более сложной укладки неравномерно распределенных столбцов/строк. В вашем случае MAP() будет работать и проще, чем BYROW():

=LET(input, {"a,b;c,d;";"e,d;f,g;"},
  MAP(input, LAMBDA(item, TEXTJOIN(";",,TEXTSPLIT(item,",",";", TRUE)))))

И, честно говоря, именно для этого и предназначена MAP().

Спасибо, @JvdV, я не проверял замену BYROW на MAP, и это работает, так что, вероятно, вы правы, проблема в BYROW, а не в TEXTSPLIT. Знаете ли вы, куда можно сообщить об ошибке Microsoft Excel? Спасибо

David Leal 11.11.2022 14:47

@DavidLeal вот иди.

JvdV 11.11.2022 15:42

Спасибо, JvdV Я попробовал это в другом случае, после того, как разговаривал по телефону около 1 часа. Они сказали мне, что мне нужно обратиться с внутренним процессом в моей компании к человеку, которому принадлежит бизнес-аккаунт, потому что только он может взаимодействовать со службой поддержки, поэтому я не могу опубликовать ошибку, как в других продуктах, таких как Jira, это невозможно с Microsoft, это должно проходить по официальным каналам, а электронная почта не работает. Спасибо, в любом случае

David Leal 11.11.2022 16:20

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

Ron Rosenfeld 06.12.2022 02:08

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