Я тестирую следующий простой случай:
=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 при использовании массива строк.
Хорошая идея, чтобы преодолеть это, но зачем нам это нужно? Мне не удалось найти никакой документации, объясняющей, что использовать BYROW невозможно. Да, ваш подход работает: =LET(input, {"a,b;c,d;";"e,d;f,g;"},DROP(REDUCE("", input, LAMBDA(acc,x, VSTACK(acc, TEXTJOIN(";",,TEXTSPLIT(x,",",";", TRUE))))),1)). Я не думаю, что смогу использовать его в своем реальном примере, потому что ввод представляет собой одну строку, которая генерирует массив.
Я смог заставить его работать в реальном примере, но все же мне непонятно, почему он не работает с BYROW.
Интересный. Похоже, ваш выбор точек с запятой и запятых в строке неудачен: замена их другими символами работает нормально, например LET(input,{"a|b\c|d\";"e|d\f|g\"}. Поскольку выбранные вами символы совпадают с разделителями строк/столбцов в англоязычных версиях Excel, я могу только предположить, что происходит какая-то ошибочная внутренняя неверная интерпретация этих символов как разделителей строк/столбцов.
Я думаю, что это та же проблема, что описана здесь: stackoverflow.com/a/73886031/16578424 — см. последний комментарий Скотта Крамера. Но почему бы вам не использовать: =LET(input,{"a,b;c,d;";"e,d;f,g;"}, replaced,SUBSTITUTE(input,",",";"), LEFT(replaced,LEN(replaced)-1))
@Ike Я пытался изолировать проблему от другой проблемы. Сам образец бесполезен, потому что он возвращает почти то же самое, что и ввод. Единственная цель — показать проблему, с которой я столкнулся в других ситуациях.
@JosWoolley Я проверил: =LET(input, {"a|b\c|d\";"e|d\f|g\"}, BYROW(input, LAMBDA(item, TEXTJOIN("\",,TEXTSPLIT(item,"|","\", TRUE))))) и это не работает, тот же результат. Если вы меняете разделители в input, вам нужно изменить их и в TEXTJOIN, и в TEXTSPLIT тоже. Обходной путь, который работает, указан @JvdV в его ответе.



Не уверен, что это будет классифицироваться как ответ, но решил поделиться своей попыткой.
Я не думаю, что проблема здесь 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? Спасибо
@DavidLeal вот иди.
Спасибо, JvdV Я попробовал это в другом случае, после того, как разговаривал по телефону около 1 часа. Они сказали мне, что мне нужно обратиться с внутренним процессом в моей компании к человеку, которому принадлежит бизнес-аккаунт, потому что только он может взаимодействовать со службой поддержки, поэтому я не могу опубликовать ошибку, как в других продуктах, таких как Jira, это невозможно с Microsoft, это должно проходить по официальным каналам, а электронная почта не работает. Спасибо, в любом случае
Я считаю, что проблема с BYROW и TEXTSPLIT заключается в том, что, согласно документации, связанный LAMBDA может возвращать только одно значение.
REDUCE()может сделать этот трюк. Смотрите этот пост. stackoverflow.com/questions/73852522/…