Преобразование штрих-кодов в определенный формат с использованием функции Excel, FIND & MID Excel

4

В Excel у меня есть ряд столбцов, содержащих символы разных типов, такие как:

WS-S5-S-L1-C31-F-U5-S9-P14 
WS-S5-S-L1-C31-F-U5-S8-P1 
WS-S5-N-L1-C29-V-U16-S6-P6 

Я хочу преобразовать их в 8 символов, используя следующие правила:

  • сохранить только последние три сегмента
  • удалите U и добавьте префикс 0, где это необходимо
  • удалите S и добавьте префикс 0, где это необходимо
  • удалите P и добавьте префикс 0, где это необходимо

Например:

  • WS-S5-S-L1-C31-F-U5-S9-P14 преобразовать в 05-09-14
  • WS-S5-S-L1-C31-F-U5-S8-P1 преобразовать в 05-08-01
  • WS-S5-N-L1-C29-V-U16-S6-P6 преобразовать в 16-06-06

Я считаю , что есть способ использовать IF, FINDи MIDработать , чтобы преобразовать их в Excel , но не знаю , как начать. Любая помощь будет высоко ценится.

Обновить

Наконец, я хотел преобразовать это в 13 символов, если это возможно, например:

  • WS-S5-S-L1-C31-F-U5-S9-P14 преобразовать в S1-F-05-09-14
  • WS-S5-N-L2-C31-D-U5-S8-P1 преобразовать в N2-D-05-08-01
  • WS-S5-N-L1-C29-V-U16-S6-P6 преобразовать в N1-V-16-06-06
Инди
источник
Струны всегда имеют одинаковую длину?
Кевин Энтони Оппегаард Роуз
1
@Kevin: нет, смотрите «U5» против «U16»
Máté Juhász
Строки имеют разную длину, и я использовал следующую формулу, которая возвращает «05» из WS-S5-S-L1-C31-F-U5-S9-P14. Но как мне вернуть «05-09-14»? = ЕСЛИ (MID (Е13, FIND ( "U" -, E13) +3,1) = "-", "0" & MID (E13, FIND ( "- U", E13) +2,1), MID ( E13, НАЙТИ ("- U", E13) +2,2))
Indy

Ответы:

6

Как отметил @ygaft, это возможно, но будет долго со стандартными функциями Excel.

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

Формула:
=RegExReplace(RegExReplace(A1,".*U([0-9]+)-S([0-9]+)-P([0-9]+)","0$1-0$2-0$3"),"0([0-9]{2})","$1")

Как это устроено:

  • внутренняя функция:
    • A1: из содержимого ячейки А1
    • ".*U([0-9]+)-S([0-9]+)-P([0-9]+)" найдите шаблон "... U # -S # -P #", где "#" представляет одно или несколько чисел и запоминает числа (квадратные скобки создают группы ссылок)
    • "0$1-0$2-0$3" объединяет числа, найденные в предыдущем шаге, добавляя перед ними 0.
  • внешняя функция:
    • RegExReplace(...) - работает с результатами внутренней функции
    • "0([0-9]{2})" - ищет 0, за которым следуют две цифры (= случаи, когда в начале 0 нет необходимости)
    • "$1" - сохраняет только две цифры, отбрасывая ведущий 0 (только в случаях, которые были сопоставлены на предыдущем шаге)

введите описание изображения здесь

Вы также можете увидеть больше объяснений в регулярных выражениях онлайн:

Примечание: я никак не связан с этой надстройкой, просто используйте ее, так как она облегчит мою жизнь.

Обновить

Вы можете использовать эту формулу для своего кода из 13 символов:
=RegExReplace(RegExReplace(A3,".*-([A-Z])-[A-Z]([0-9]).*-([A-Z])-U([0-9]+)-S([0-9]+)-P([0-9]+)","$1$2-$3-0$4-0$5-0$6"),"0([0-9]{2})","$1")

Мате Юхас
источник
Это отличная надстройка для использования. Работал отлично. Наконец, я хотел преобразовать это в 13 символов, если это возможно, например: * WS-S5-S-L1-C31-F-U5-S9-P14 преобразовать в S1-F-05-09-14 * WS-S5- N-L2-C31-D-U5-S8-P1 преобразовать в N2-D-05-08-01 * WS-S5-N-L1-C29-V-U16-S6-P6 преобразовать в N1-V-16- 06-06
Indy
как вы имеете в виду 13 символов? Пожалуйста, обновите свой вопрос, и я обновлю свой ответ
Máté Juhász
Основное преобразование: • WS-S5-S-L1-C31-F-U5-S9-P14 в S1-F-05-09-14 • WS-S5-N-L2-C31-D-U5-S8-P1 в N2-D-05-08-01 • WS-S5-N-L1-C29-V-U16-S6-P6 до N1-V-16-06-06 Таким образом, используются 7-й, 10-й, 15,16 и 17-й символы
Инди
5

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

=TEXT(LEFT(RIGHT(A1,LEN(A1)-FIND("U",A1,1)),FIND("-",RIGHT(A1,LEN(A1)-FIND("U",A1,1)),1)-1),"00")&"-"&TEXT(MID(RIGHT(A1,LEN(A1)-FIND("U",A1,1)),FIND("-",RIGHT(A1,LEN(A1)-FIND("U",A1,1)),1)+2,(FIND("P",RIGHT(A1,LEN(A1)-FIND("U",A1,1)),1)-2-FIND("S",RIGHT(A1,LEN(A1)-FIND("U",A1,1)),1))),"00")&"-"&TEXT(RIGHT(RIGHT(A1,LEN(A1)-FIND("U",A1,1)),LEN(RIGHT(A1,LEN(A1)-FIND("U",A1,1)))-FIND("P",RIGHT(A1,LEN(A1)-FIND("U",A1,1)),1)),"00")
ygaft
источник
Используется отличная техника, но код работает довольно долго.
Инди
чтобы сделать его короче, вы можете добавить вспомогательный столбец с этой функцией: '= RIGHT (A1, LEN (A1) -FIND ("U", A1,1)' и затем обратиться к этому столбцу вместо всего этого фрагмента кода
ygaft