Необходимо удалить несоответствующий текст из строки Excel с разделителями - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть запрос к базе данных Excel, чтобы получить все роли пользователей RBAC, назначенные каждому пользователю, и база данных возвращает строку, разделенную символом & (амперсанды) между каждой ролью пользователя, например ::100100

&Admin&Supervisor&ViewReports&WriteReports&

Мой запрос фильтрует записи, которые имеют только совпадающую строку, скажем, это Reports. Однако он по-прежнему возвращает полный список ролей пользователей для соответствующего пользователя, и в этом случае некоторым пользователям назначается> 10 ролей, и это делает таблицу действительно грязной и не пригодной для печати. ​​

Я мог бы вручную очистить каждую строку, но их довольно много, и, поскольку это будет выполняться регулярно, мне интересно, может ли быть хорошая формула Excel или метод VBS для разделения разделенных разделов строка и оставляйте только те, которые соответствуют строковым критериям.

Мне известно о «Тексте в столбцы» и его способности использовать разделители, но он просто выплюнул тонну столбцов и усугубил ситуацию. Я провел несколько поисков по очистке строк с разделителями в Excel, но не смог найти результатов, похожих на мою ситуацию: нужно разделить строку с разделителями и сделать что-то вроде RegEx, чтобы сохранить только части, соответствующие шаблону.

В идеале я бы хотел сохранить очищенные результаты в одной ячейке, поэтому приведенный выше пример &Admin&Supervisor&ViewReports&WriteReports& будет выглядеть так:

ViewReports WriteReports

или

ViewReports,WriteReports

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

Ответы [ 2 ]

0 голосов
/ 27 апреля 2019

Эта формула будет работать в Excel / Office 365. Она не будет работать в более ранних версиях из-за функции TEXTJOIN, появившейся в 2016 году.

  • Предполагается, что данные представляют собой простые строки, как указано выше (т. Е. Не XML-документ, который может содержать дубликаты созданных узлов. Если бы это было так, существует другой метод разбиения строки, который мы могли бы использовать).
  • Разделить строку на амперсанде с помощью FILTERXML
  • Использование варианта функции INDEX для возврата массива соответствующих разделов
  • Объединить эти разделы с TEXTJOIN

=TEXTJOIN(" ",TRUE,INDEX(FILTERXML("<t><s>" & SUBSTITUTE(A1,"&","</s><s>")&"</s></t>","//s"),N(IF(1,{3,5}))))

Часть …N(IF(1,{3,5}))… - это способ возврата массива значений из функций INDEX. В этом случае 3 и 5 относятся к значению перед третьим и пятым амперсандом . Обратите внимание, что 1 вернет ошибку, поскольку перед первым амперсандом ничего нет.

Вы можете вернуть любой элемент, который хотите. Вам просто нужно знать (или рассчитать с помощью функции MATCH) правильные номера индексов.

Обратите внимание, что с помощью TEXTJOIN вы можете указать любой желаемый разделитель. Я указал space, но вы можете указать comma или что угодно.

enter image description here

0 голосов
/ 26 апреля 2019

вы можете использовать комбинацию обрезки, середины и замещения, чтобы найти свои значения, используя приведенный выше пример:

, если у вас есть пустой лист Excel и поместите ваш пример в ячейку A3, поместите 1,2,3 и 4 в ячейках B2, C2, D2, E2, затем скопируйте эту формулу в ячейку B3:

=TRIM(MID(SUBSTITUTE($A3,"&",REPT(" ",LEN($A3))),(B$2-1)*LEN($A3)+1,LEN($A3)))

. Это должно дать вам значение "Admin".

После этого просто потянитеформулы справа, и вы получите все 4 значения в вашем примере. Пожалуйста, дайте мне знать, если вам нужно больше объяснений.

Для получения дополнительной информации об этом уравнении, пожалуйста, см. веб-страницу: https://exceljet.net/formula/split-text-with-delimiter

...