将string拆分成具有特定模式和条件的部分
我有如下几个5k +string的数组作为某些应用程序的输出(出于安全原因,我可能不提供确切的数据,但示例格式与实际数据非常相似):
kasdfhkasdhfaskdfj42345sdsadkfdkfhasdf5345534askfhsad asdfasdf66sdafsdfsdf4560sdfasdfasdf sdfaasdfs96sadfasdf65459asdfasdf sadfasdf8asdfasdas06666654asdfasdfsd fasdjfsdjfhgasdf6456sadfasdfasdf9sdfasdfsadf
简单地说,我有非破坏性的字母数字string,由5个部分组成 :
[latin letters][1 or more digits][latin letters][1 or more digits][latin letters]
字母部分的长度,以及数字的数量是随机的,整个string的长度可以从几个变化到2-3 个字符,但是模式仍然如上。
实际上,我对前导string和尾随string部分很感兴趣,即[1 or more digits][latin letters][1 or more digits]
可能被丢弃,但另外2个string应该被提取以分隔单元格。
我尝试了SUBSTITUTE
和SEARCH
function,但是我仍然可能无法处理随机数字的数字。 VBA是最后期望的方法,但是如果纯粹的公式是无用的,则是可以接受的。 此外,解决scheme应该是灵活的,以便将来可能使用类似的模式 – 所以任何正确的指导/一般方法将不胜感激。
如果您不介意使用MS Word而不使用Excel,那么对于涉及使用通配符的内置Search and Replace
例程的这些任务,有一种非常简单的方法。 假设数据可能在Word中打开,请执行以下操作:
- 按CTRL + Hreplace对话框打开。
- 勾选
Use wildcards
选项。 - 你想扔掉的部分数据匹配以下模式:
[0-9]{1,}*[0-9]{1,}
– 这意味着任何数字1次或更多次之间的任何字符。 取决于您需要的区域设置;
而不是在这里。 - 指定你喜欢的任何字符作为replace,例如
^t
(Tab)或;
– 进一步拆分零件。 - 执行更换。
- 或者,您可以使用function区
Insert > Table > Convert Text to Table...
function将其余的Insert > Table > Convert Text to Table...
。
您现在只需要保存/粘贴所获得的结果。
实际上,这个方法非常强大,许多类似于你的常规文本数据parsing任务可能会很快完成,而没有特殊的技能和/或编程。 而且你不需要任何第三方工具 – 现在每台电脑都安装了Word。
详细了解模式和适用案例:
- 使用通配符查找和replace
- 使用通配符查找和replace字符
基于这个来自伟大的chandoo的教程 (如果你想在excel中变得棒极了,你应该遵循这个教程 :
使用这个公式(注意一个数组公式,你需要input它+ ENTER + SHIFT + CTRL )来提取
{=MIN(IFERROR(FIND(lstNumbers,G6),""))}
其中lstNumbers是单元格中包含0-9(单元格中的每个数字)和e1中包含数据的单元格中的命名范围。
这将返回第一个数字,然后你可以提取第一部分:
=LEFT(E1,G1-1)
其中e1包含数据和g1前面的公式
得到你使用的数字部分的结尾:
{=MAX(IFERROR(FIND(lstNumbers,E1),""))}
那么你可以使用mid来提取数值部分,并使用len(datacell) – len(从max函数)来提取右边(或中间)剩下的string。 在那里我们将使用相同的处理 – 获得第一个数字与最小,最后与最大等
祝你好运! 这是一个真正的难题,用真正的编程语言来做这个也许会更容易
更新:
这个数组公式会给你第一个string部分:
=LEFT(A1,MATCH(0,1*ISERROR(1*MID(A1,ROW(INDIRECT("$A1:$A"&LEN(A1))),1)),0)-1)
这个数组公式会给你最后一个string部分:
=RIGHT(A1,MATCH(0,1*ISERROR(1*MID(A1,LEN(A1)+1-ROW(INDIRECT("$A1:$A"&LEN(A1))),1)),0)-1)