2013-02-14 36 views
4

我有下面类似于某个应用程序输出的大约5k +字符串的数组(出于安全原因,我可能无法提供确切的数据,但示例格式非常类似于实际数据):将字符串拆分为具有特定模式和条件的部分

kasdfhkasdhfaskdfj42345sdsadkfdkfhasdf5345534askfhsad 
asdfasdf66sdafsdfsdf4560sdfasdfasdf 
sdfaasdfs96sadfasdf65459asdfasdf 
sadfasdf8asdfasdas06666654asdfasdfsd 
fasdjfsdjfhgasdf6456sadfasdfasdf9sdfasdfsadf 

简单地说,我有由5份非间断的字母数字字符串:

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

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

实际上我感兴趣的开头和结尾的字符串件,即[1 or more digits][latin letters][1 or more digits]可能只是随意丢弃,而另外2个字符串应该被提取分离细胞。

我试过SUBSTITUTESEARCH功能,但我仍然可能不处理随机数字的数字。 VBA是最后期望的方法,但是如果纯粹的公式无用,则是可以接受的。此外,解决方案应该灵活,以便将来可能使用类似的模式 - 所以任何正确的指导/一般方法将不胜感激。

+0

也许这将设置你在正确的轨道上:office.microsoft.com:从字母数字串中提取号码(HTTP://办公室。 microsoft.com/en-us/excel-help/extracting-numbers-from-alphanumeric-strings-HA001154901.aspx) – Tim 2013-02-14 17:37:11

+0

@Tim感谢您的建议,请等待可能的答案时尝试。 – Ksenia 2013-02-14 17:42:33

回答

3

例程使用通配符。假设数据可以在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。

了解更多关于模式和适用例:

+0

该死的,但这是+1的棘手方法和简单性))) – 2013-02-14 18:06:51

+0

@PeterL。谢谢!我使用这个例程来处理大量的数据数组,特别是对于一次性解决方案。 – 2013-02-14 18:19:55

+0

@MaksGordeev这个建议很棒:简单,直观,如果需要可以进行宏编码。对于类似的1次解决方案来说绝对是必须做的。感谢您的好教程。 – Ksenia 2013-02-14 19:16:44

2

基于this tutorial从大chandoo(谁如果你想成为真棒在Excel中,应该遵循:

使用这个公式(注意数组公式,你需要进入它ENTER + SHIFT + CTRL)提取

{=MIN(IFERROR(FIND(lstNumbers,G6),""))} 

其中lstNumbers是在与含有0-9(在一个小区中的每个数量的单元片材一个命名的范围)和E1包含数据的单元格。

这将retur n个第一数 ,然后你可以提取与第一部分:

=LEFT(E1,G1-1) 

其中,e1包含数据和G1前面的公式

获得数字部分的使用端:

{=MAX(IFERROR(FIND(lstNumbers,E1),""))} 

然后您可以使用mid来提取数值部分并使用len(datacell) - len(从max函数)来提取右边(或中间)剩下的字符串。我们将使用相同的处理方式 - 获取第一个分数,最后一个分配最大值等。

祝你好运!还有对于其中涉及内置Search and Replace这样的任务非常简单的方法 - 这是一个真正hardone,与真正的编程语言,这样做会如果你不介意使用微软Word代替Excel中更容易也许

+0

感谢您的建议,但我想避免任何临时计算,例如解决方案中的命名区域。尽管如此,对于努力和友好链接来说,这是一个公平的赞赏。 – Ksenia 2013-02-14 17:56:52

+0

您也可以在另一个工作表或工作簿中使用命名的区域。无论如何祝你好运 – alonisser 2013-02-14 18:00:03

+0

为了避免命名区域,用TEXT(行(A1:A10)-1,“0”)替换lstNumbers ....你仍然必须使用矩阵forumla – romar 2013-02-14 18:01:34

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

感谢您的另一个不错的选择! – Ksenia 2013-02-14 19:17:33