Как разбить текст на столбцы, пока не будет встречена заглавная буква или цифра - PullRequest
1 голос
/ 29 апреля 2019

Так вот в чем проблема, у меня есть таблица с именами оборудования, где я хочу разбить текст на столбцы, пока не встретится заглавная буква или число.

Вот как выглядит таблица:

Таблицакак есть

image

Вот как это должно быть после разделения:

Таблица будет

image

Я думал, используя левую функцию, но не знаю, как включить условие заглавной буквы!Вот что я попробовал:

 =LEFT(A2,SMALL(FIND(CHAR(ROW(INDIRECT("65:90"))),A2&"ABCDEFGHIJKLMNOPQRSTUVWXYZ"&"АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"&"1234567890" ),2)-1)

К сожалению, это не работает ... Важное примечание: заглавные буквы могут быть написаны как на кириллице, так и на латинице

Также возможно ли выполнитьэта цель легче в Power Query?

Спасибо!

Редактировать: добавлены мои попытки

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Вы можете сделать это с помощью Power Query. Я уверен, что есть более чистый способ сделать это, но SplitOnAnyDelimiter, похоже, не имеет возможности разбить только на первый экземпляр, и у меня нет времени записать все в сжатый M-код, поэтому для Теперь я добавил несколько пользовательских столбцов:

  • Удалите первую букву, чтобы не найти заглавную букву в начале.
  • Затем найдите позицию первого появления любой цифры, заглавную латиницу, заглавную кириллицу
  • Вернуть часть строки до этой позиции.
  • Возвращает часть строки после этой позиции.
  • Удалить ненужные столбцы

М-код:

let
    Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Name", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "2nd", each Text.Middle([Name],1)),
    #"Added Custom1" = Table.AddColumn(#"Added Custom", "Position", each Text.PositionOfAny([2nd],{"0".."9","A".."Z","А".."Я"},Occurrence.First)),
    #"Added Custom2" = Table.AddColumn(#"Added Custom1", "Equipment", each Text.Start([Name],[Position])),
    #"Added Custom3" = Table.AddColumn(#"Added Custom2", "Custom", each Text.Middle([2nd],[Position])),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom3",{"Name", "2nd", "Position"})
in
    #"Removed Columns"

Источник

enter image description here

Результаты

enter image description here

РЕДАКТИРОВАТЬ Я подозреваю, что следующий код может быть более эффективным, поскольку добавляются только столбцы результатов:

let
    Source = Excel.CurrentWorkbook(){[Name="Table5"]}[Content],

#"Changed Type" = Table.TransformColumnTypes(Source,{{"Name", type text}}),
#"Added Custom" = Table.AddColumn(#"Changed Type", "Equipment", each Text.Start([Name],
        Text.PositionOfAny(Text.Middle([Name],1),{"0".."9","A".."Z","А".."Я"},Occurrence.First))),
#"Added Custom1" = Table.AddColumn(#"Added Custom", "Part No", each Text.Middle([Name],
    Text.PositionOfAny(Text.Middle([Name],1),{"0".."9","A".."Z","А".."Я"},Occurrence.First)+1)),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom1",{"Name"})
in
    #"Removed Columns"
1 голос
/ 29 апреля 2019

Вот путь без VBA / RegEx:

enter image description here

Формула в B1:

{=LEFT(A1,SMALL(IFERROR(MATCH(FullList,UNICODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1)))+1,1)),0),0),SUMPRODUCT(--(IFERROR(MATCH(FullList,UNICODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1)))+1,1)),0),0)=0))+1))}

Уведомление для ввода в виде массива через Ctrl Shift Ввод

Формула в С1:

=RIGHT(A1,LEN(A1)-LEN(B1))
  • Обратите внимание, что в колонке B есть пробел.

  • Полный список - это именованный диапазон на другом листе, ссылающийся на список ЮНИКОДОВ, которые обозначают все заглавные латинские и кириллические буквы плюс цифры. Итак, список из 48-57, 65-90 и 1040-1071.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...