在 Excel 2016 中将可变长度的字符串拆分为代码(也是可变长度的)

Splitting variable length strings into codes (also of variable lengths) in Excel 2016

在过去的几周里,我一直在研究 Excel,我想通过一个通用公式让我的生活更轻松,我可以将其应用于我的电子表格以从中提取所有代码一个领域内。

通常,我只是看看代码是用什么分隔的,然后在前面的列或“_”上用 FIND() 执行 MID(),但在这种情况下,所有东西 都用下划线分隔,而不仅仅是代码,有时代码用连字符分隔,所以我没有被告知的命名约定给我带来了很多麻烦。 .

示例:

假设我们有一个这样的字符串可以使用

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))

下面是电子表格的屏幕截图:

如果有人能提供一些建议和帮助,将不胜感激。

我不确定您是否给了我们足够的信息来给出完整的答案,因为演示字符串中的代码不是很明显,但这是我将使用的方法:

  • 使用两组列:第一组用于查找代码开始的位置(使用 FIND),第二组用于实际查找代码(使用 MID),这使得公式的开发比尝试更容易在一组公式上完成所有事情。
  • 使用 IFERROR 处理 find 函数找不到任何东西的情况

前三个公式类似于

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

其中 find 的语法是 FIND(find_text,within_text,start_num) 请注意,通过使用先前查找的值作为 start_num 我们处理字符串。

第二组公式类似于

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

只要文件名结构一致,就可以使用这种方法。

除了 Olly John

所说的 图像名称 的不一致

I'm not sure how I would go about determining the number of codes that would be returned as the file names vary quite significantly thoughout the dataset.

查看提供的示例,似乎 _n- string 可用于将 Image Name 拆分为多个部分(最多 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

P4: _n-2200

这两部分最多包含三个代码,由 _n-- strings 分隔,结果为:

代码 1: 041cx

代码 2: 080ac

代码 3: 2200

基于上述以及应用于图像名称的命名约定的不规则结果,我提出以下建议:

添加工作列以保存用于拆分代码的字符串并查看拆分的部分结果(见下图) 图1

字段:描述

Value\Formula

s1: 用于拆分的字符串

_n-

要排除的 INI: 要排除的初始字符串

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

Len: 要排除的结束字符串的 Len

6

END to exclude: End string to exclude

=RIGHT($A2,$E2)

带代码的文本:包含所需代码的字符串

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

s2: 用于拆分的字符串

-

p1: 找到字符串的位置

1

p2 到 p4:找到的字符串位置

=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个 图2