将字符串拆分为具有特定图案和条件的零件

时间:2013-02-14 17:18:53

标签: excel pattern-matching excel-formula

我有一个大约5k +字符串的类似数组作为某些应用程序的输出(出于安全考虑,我可能无法提供确切的数据,但示例格式与实际数据非常相似):

kasdfhkasdhfaskdfj42345sdsadkfdkfhasdf5345534askfhsad
asdfasdf66sdafsdfsdf4560sdfasdfasdf
sdfaasdfs96sadfasdf65459asdfasdf
sadfasdf8asdfasdas06666654asdfasdfsd
fasdjfsdjfhgasdf6456sadfasdfasdf9sdfasdfsadf

简单地说,我有非破坏的字母数字字符串,由 5部分组成:

[latin letters][1 or more digits][latin letters][1 or more digits][latin letters]

字母部分的长度以及数字位数是随机的,整体字符串长度可能从几个到2-3 数百 不等chars,但模式仍然如上所述。

实际上我对前导和尾随字符串部分感兴趣,即[1 or more digits][latin letters][1 or more digits]可能会被丢弃,但是应该提取其他2个字符串来分隔单元格。

我尝试了SUBSTITUTESEARCH个功能,但我仍然可能无法处理随机数量的数字。 VBA是最后期望的方法,但是在纯公式无用的情况下是可接受的。此外,该解决方案应具有灵活性,以便将来可能使用类似的模式 - 因此,任何正确的指导/一般方法都将受到赞赏。

3 个答案:

答案 0 :(得分:3)

如果您不介意使用 MS Word 而不是Excel - 对于此类任务有一种非常简单的方法,其中涉及使用通配符Search and Replace例程>。假设可以在Word中打开数据,请执行以下操作:

  1. CTRL + H 打开“替换”对话框。
  2. 勾选Use wildcards选项。
  3. 您要丢弃的数据部分符合以下模式:[0-9]{1,}*[0-9]{1,} - 这意味着任何数字1次或更多次,其间包含任何字符。根据您的区域设置,您需要;而不是,
  4. 指定您喜欢的任何字符,例如^t(Tab)或; - 用于进一步分割部分。
  5. 执行更换。
  6. 您可以选择使用功能区Insert > Table > Convert Text to Table...功能将其余内容转换为表格。
  7. 现在您只需要保存/粘贴获得的结果。

    实际上,这种方法非常强大,并且可以在没有特殊技能和/或编程的情况下快速完成许多与您类似的常规文本数据解析任务。而且你不需要任何第三方工具 - 现在每台PC都安装了Word。

    详细了解模式和适用案例:

答案 1 :(得分:2)

基于来自伟大chandoo的this tutorial(如果你想在excel中表现出色,你应该遵循:

使用此公式(注意数组公式,您需要使用 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函数)来提取右边(或中间)字符串的其余部分。我们将使用相同的处理 - 使用min获取第一个数字,使用max etc获取最后一个数字

祝你好运!这是一个真正的硬汉,用真正的编程语言做这件事也许会更容易

答案 2 :(得分:2)

更新:

这个数组公式将为您提供第一个字符串部分:

  =LEFT(A1,MATCH(0,1*ISERROR(1*MID(A1,ROW(INDIRECT("$A1:$A"&LEN(A1))),1)),0)-1)

此数组公式将为您提供最后一个字符串部分:

  =RIGHT(A1,MATCH(0,1*ISERROR(1*MID(A1,LEN(A1)+1-ROW(INDIRECT("$A1:$A"&LEN(A1))),1)),0)-1)