2015-09-13 3 views
0

Я за последние несколько недель много играл с Excel, и я хочу сделать свою жизнь проще, имея формулу одеяла, которую я могу применить в мою таблицу, чтобы извлечь все коды из поля.Разбиение строк переменной длины на коды (также переменной длины) в Excel 2016

Обычно я просто смотрю, что коды были разделены, и просто MID() с FIND() в столбце до или «_», но в этом случае все разделяется подчеркиваниями, а не только кодами, а иногда коды делятся на дефисы, поэтому соглашение об именах, к которым я не привык, вызывает у меня немало неприятностей по этому поводу.

Пример:

Предположим, у нас есть такая строка, чтобы работать с

blahblahblah_n-codeone-codetwo_codethree_blah.blah

Я хотел бы, чтобы извлекать «codeone», «CodeTwo» и «codethree», как это:

 
+==========================================================================================+ 
|     INITIAL STRING     | CODE_1 | CODE_2 | CODE_3 | 
+==========================================================================================+ 
| blahblah_n-codeone-codetwo_codethree_blah.blah | codeone | codetwo | codethree | 
+==========================================================================================+ 

Несколько кодов разной длины, в пределах от 5 символов до 3-х символов и в строке может быть до четырех кодов. Было бы полезно, если бы столбцы для кодов, которые не могли быть найдены, были бы пустыми. Например, если в строке есть 2 кода, то столбцы CODE_3 и CODE_4 останутся пустыми.

Формула, которую я пробовал использовать совсем недавно, приведен ниже, но она не обрабатывает разные длины кодов или даже разные номера кодов, поэтому на самом деле это не так.

UPPER(MID(B4,(FIND(LOWER(D4),B4)+6),5))

Скриншот ниже в таблице: Example of how I'd like the table to look once codes are extracted

Если кто-то может предложить некоторые советы и помощь, которые были бы очень признателен.

+0

Если фиксированный предел возвратов может быть определен до того, как формула будет обработана, можно рассмотреть формулу родного рабочего листа. Если нет, то пользовательская функция (как UDF) будет более уместной и, возможно, будет более уместной в любом случае. – Jeeped

+0

Я не уверен, как бы я определил количество кодов, которые будут возвращены, поскольку имена файлов значительно отличаются от набора данных. Не могли бы вы предложить некоторые рекомендации о том, как писать UDF для этого? –

+0

Более подробная информация в Именах изображений из представленного вами изображения, чем то, что вы здесь описываете. Например, на картинке все коды, как представляется, предварительно задерживаются в следующей последовательности: '_n-'. Это может быть очень полезно. Это общее правило? Также из картинки вы, кажется, игнорируете первый и последний коды ... каждый раз. Это тоже правило? –

ответ

1

За непоследовательности изображения имен как заявил Олли Джон

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

Глядя на образцах при условии, что, кажется, что _n-string может быть использован для разделения Название изображения на куски (до 4-х штук «Pn»)

Название изображения: exroof_1405_k16_n-350kh-2_n-041cx-080ac_n-2200_4.jgp

P1: exroof_1405_k16

P2: _n-350kh-2

P3: _n-041cx-080ac

P4: _n-2200_4.jgp

Тогда за исключением первых двух частей, а последние шесть символов последней части мы следующих двух частей:

P3_n-041cx-080ac

Р4: _n-2200

Эти две части содержат до трех кодов, которые отделены друг от друга _n- или -strings в результате чего:

code1: 041cx

code2: 080ac

Code 3: 2200

На основании вышеизложенных и нерегулярных результатах именования применительно к Названию изображений Я предлагаю следующее:

Добавить работать столбцы для хранения строк используются для разделения кода и увидеть частичный результат раскола (см. рис. ниже) enter image description here Fig.1

Поля: Описание

Значение \ Формула

s1: строка используется для разделения

_n- 

INI исключить: начальная строка исключить

=LEFT($A2,(-1+SEARCH($C2,$A2,1+SEARCH($C2,$A2))+LEN($C2))) 

Len: Len концевой строки исключить

6 

END исключить: Конец строки исключить

=RIGHT($A2,$E2) 

текст с кодами: String проведение необходимых кодов

=SUBSTITUTE(SUBSTITUTE($A2,$D2,""),$F2,"") 

s2: строка используется для разделения

- 

p1: Положение строк найдено

1 

p2 Р4: Положение строки поиска

=IFERROR(IF(SEARCH($C2,$G2,1+I2)<SEARCH($H2,$G2,1+I2), 
SEARCH($C2,$G2,1+I2), 
SEARCH($H2,$G2,1+I2)), 
1+LEN($G2)) 

Код 1 до 3: Коды

=UPPER(SUBSTITUTE(SUBSTITUTE(MID($G2,I2,SUM(J2,-I2)),$C2,""),$H2,"")) 

Вставить Заявление: Заявления на основе кодов

=IF(EXACT($M2,""),""," insert into TABLE values("&$B2&",'"&$M2&"');")& 
IF(EXACT($N2,""),""," insert into TABLE values("&$B2&",'"&$N2&"');")& 
IF(EXACT($O2,""),""," insert into TABLE values("&$B2&",'"&$O2&"');") 

Рабочие колонны могут быть сгруппированы и показанными только в случае необходимости см. 2 enter image description here Рис. 2

+0

Я действительно нашел способ сделать это, используя ответ, который я принял вчера, после его корректировки, чтобы лучше подобрать коды (оказалось, что те, которые я показал, были среди более простых, чтобы сломать), но спасибо за ваш ответ - я без сомнения, я буду говорить об этом в будущем! –

+0

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

+0

Да, есть несколько. Я начал использовать метод, который вы дали сейчас, поскольку некоторые из других паттернов, с которыми мы должны работать, очень разные, и я не мог понять, как манипулировать тем, что я делал раньше, чтобы заставить его работать, так что даже более того, вы очень помогли :) –

1

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

  • использование два набора столбцов: первый набор для поиска мест, в которых начинаются коды (с использованием FIND), и второй набор для фактического нахождения кодов (с использованием MID), это упрощает разработку формул, чем попытки сделать все на одном наборе формул.
  • использование IFERROR для рассмотрения случаев, когда функция поиска ничего не находит

первых три формулы, то будет что-то вроде

C3 - IFERROR(FIND($B3,"n-"),len($B3)) 
D3 - IFERROR(FIND($B3,"-",C3+1),len($B3)) 
E3 - IFERROR(FIND($B3,"-",D3+1),len($B3)) 

где синтаксис находки является FIND (найти_текст, within_text , start_num) Обратите внимание, что, используя значения предыдущего find как start_num, мы работаем через строку.

второй набор формул будет что-то вроде

IF(C3=len($B3),"",MID($B3,C3+2,D3-C3-3)) 

До тех пор, как существует последовательная структура имен файлов должна быть возможность использовать этот подход.

+0

Извинения, это было мое плохое, поскольку я публиковал с довольно взволнованным мышлением! Как вы можете видеть на скриншоте таблицы, которую я опубликовал, коды похожи на «041CZ», «080AC» и «2200» или «788». Когда коды находятся в формате NUMNUMNUMCHARCHAR, все в порядке, поскольку они, очевидно, имеют одинаковую длину, но я сталкиваюсь с проблемами, когда они всего лишь такие цифры, как 2200 и 788, а также что делать, чтобы иметь дело с (до) 4-мя кодами , Любые советы и/или решения были бы высоко оценены! –

+0

Подход, который я предложил, является обобщенным, который должен быть адаптирован для работы с любым строковым форматом, если он согласован. –

+0

Fab, я попробую и вернусь к вам. –

Смежные вопросы