4

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

kasdfhkasdhfaskdfj42345sdsadkfdkfhasdf5345534askfhsad
asdfasdf66sdafsdfsdf4560sdfasdfasdf
sdfaasdfs96sadfasdf65459asdfasdf
sadfasdf8asdfasdas06666654asdfasdfsd
fasdjfsdjfhgasdf6456sadfasdfasdf9sdfasdfsadf

简单地说,我有由5 个部分组成的不间断字母数字字符串:

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

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

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

我尝试SUBSTITUTESEARCH函数,但我仍然可能无法处理随机数量的数字。VBA 是最后需要的方法,但是如果纯公式无用,它是可以接受的。此外,该解决方案应该是灵活的,以便将来可能使用类似的模式 - 因此任何正确的指导/一般方法都将受到赞赏。

4

3 回答 3

4

如果您不介意使用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...

您现在需要的只是保存/粘贴获得的结果。

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

阅读有关模式和适用案例的更多信息:

于 2013-02-14T18:04:04.827 回答
2

基于来自伟大的chandoo的本教程(如果你想在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(from max function) 来提取字符串的其余部分。我们将使用相同的处理方法——用 min 获取第一个数字,用 max 获取最后一个数字等

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

于 2013-02-14T17:47:46.050 回答
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)
于 2013-02-14T18:35:57.690 回答