0

在过去的几周里,我一直在玩 Excel 很多次,我想通过一个可以应用于我的电子表格的通用公式来让我的生活更轻松,以从一个字段中提取所有代码。

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

例子:

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

blahblahblah_n-codeone-codetwo_codethree_blah.blah

我想提取“codeone”、“codetwo”和“codethree”,如下所示:

+================================================== ===========================================+
| 初始字符串 | CODE_1 | CODE_2 | CODE_3 |  
+================================================== ===========================================+
| blahblah_n-codeone-codetwo_codethree_blah.blah | 可可通 | 代码二 | 三码 |
+================================================== ===========================================+

其中几个代码的长度不同,从 5 个字符到 3 个字符不等,每个字符串最多可以有四个代码。如果无法找到代码的列留空,将会很有帮助。例如,如果字符串中有 2 个代码,则 CODE_3 和 CODE_4 列将留空。

我最近尝试使用的公式如下,但它不是不能处理不同长度的代码甚至不同数量的代码,所以它不能真正完成任务。

上(中(B4,(查找(下(D4),B4)+6),5))

电子表格下面的屏幕截图: 提取代码后我希望表格如何显示的示例

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

4

2 回答 2

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

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

于 2015-09-13T18:00:49.277 回答
1

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

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

查看提供的样本似乎_n- string可以用于将图像名称拆分为多个部分(最多 4 个“Pn”)

图片名称exroof_1405_k16_n-350kh-2_n-041cx-080ac_n-2200_4.jgp

P1exroof_1405_k16

P2_n-350kh-2

P3_n-041cx-080ac

P4_n-2200_4.jgp

然后排除前两个部分和最后一个部分的最后六个字符,我们有以下两个部分:

P3_n-041cx-080ac

P4_n-2200

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

代码1041cx

代码2080ac

代码 32200

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

添加工作列以保存用于拆分代码的字符串并查看拆分的部分结果(参见下图) 在此处输入图像描述 图 1

字段:描述

价值\公式

s1 : 用于分割的字符串

_n-

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

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

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

6

END 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

于 2015-09-14T13:11:53.380 回答