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

时间:2015-09-13 10:47:54

标签: excel excel-formula 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个字符不等,每个字符串最多可以有4个代码。如果找不到代码的列将留空,将会很有帮助。例如,如果字符串中有2个代码,则CODE_3和CODE_4列将保留为空。

我最近尝试使用的公式如下,但它不能处理不同长度的代码甚至不同数量的代码,因此它不能完全胜任任务。< / p>

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

电子表格下方的屏幕截图: Example of how I'd like the table to look once codes are extracted

如果有人可以提供一些建议和帮助,那将非常感激。

2 个答案:

答案 0 :(得分:1)

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

  • 使用两组列:第一组用于查找代码开始的位置(使用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) 请注意,通过使用前一个find的值作为start_num,我们将处理字符串。

第二组公式将类似于

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

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

答案 1 :(得分:1)

除了Olly John所说的图像名称的不一致之外

  

我不确定如何确定代码的数量   将返回,因为文件名在很大程度上变化很大   数据集。

查看提供的示例似乎可以使用_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

P4 _n-2200

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

代码1 041cx

Code2 080ac

代码3 2200

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

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

字段:说明

<强>值\式

s1 :用于拆分的字符串

_n-

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

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

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

6

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

=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  enter image description here图2