在 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
在过去的几周里,我一直在研究 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
基于上述以及应用于图像名称的命名约定的不规则结果,我提出以下建议:
添加工作列以保存用于拆分代码的字符串并查看拆分的部分结果(见下图)
字段:描述
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个