我有一个大约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个字符串来分隔单元格。
我尝试了SUBSTITUTE
和SEARCH
个功能,但我仍然可能无法处理随机数量的数字。 VBA是最后期望的方法,但是在纯公式无用的情况下是可接受的。此外,该解决方案应具有灵活性,以便将来可能使用类似的模式 - 因此,任何正确的指导/一般方法都将受到赞赏。
答案 0 :(得分:3)
如果您不介意使用 MS Word 而不是Excel - 对于此类任务有一种非常简单的方法,其中涉及使用通配符Search and Replace例程>。假设可以在Word中打开数据,请执行以下操作:
Use wildcards
选项。[0-9]{1,}*[0-9]{1,}
- 这意味着任何数字1次或更多次,其间包含任何字符。根据您的区域设置,您需要;
而不是,
。^t
(Tab)或;
- 用于进一步分割部分。Insert > Table > Convert Text to Table...
功能将其余内容转换为表格。现在您只需要保存/粘贴获得的结果。
实际上,这种方法非常强大,并且可以在没有特殊技能和/或编程的情况下快速完成许多与您类似的常规文本数据解析任务。而且你不需要任何第三方工具 - 现在每台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)