大家好,刚刚有同学在论坛上提问,发现我们补充练习《字符串处理之客户电子邮件分析》中,使用了一个从未讲过的split函数。在这里杨老师要跟大家说一声抱歉,因为split函数涉及到数组的使用,所以我们视频课程的计划中将它放在《提高篇》中,等讲解完数组之后再予以介绍。而这个补充练习,是我在面授课程中使用的案例,网站发布之前忘记在参考答案中,将split替换成我们学过的其他方法了,非常不好意思。
关于split和数组的概念,涉及到很多知识和案例,所以请大家等待我们提高篇出来时再深入学习,或者如果急用,可以先翻阅一下相关教程和网上资料。而今天我就给大家讲解一下,怎样不使用split,仅使用我们学过的字符串函数,实现同样的字符串拆分功能。
所谓拆分,就是说根据一个分隔符(比如空格、“@”,或是一段文字比如“我是华丽的分割线”),将一个字符串分解成多个小字符串。
举个例子,如果我们想把 " 张三 李四 王五 赵六 "这个字符串中,每一个人名都单独保存到一个单元格中,那么就需要对这个字符串按照空格进行拆分,最后会得到多个小字符串,每个是一个人名。
在不使用split的情况下,这种操作的主要思路就是“找空格”,最简化的思路如下:
1. 我们从最左边开始,找字符串中的第一个空格;
2. 如果发现一个这样的“起始空格”,那么就记住这个位置;
3. 然后从这个位置开始去找到下一个空格;
4. 在这两个空格之间的内容,就是一个子串,可以把它保存到单元格中;
5. 接下来,我们将第3步中找到的“下一个空格”作为第2步中的起始空格,记住它的位置,然后再去找它的“下一个空格”,如此反复执行,最终把所有子串都找到。
这里要解决的技术问题包括:
1. 怎样一个一个找空格?请大家看看我们基础篇第十七回中,讲解的Instr函数。Instr(i,s," "),就可以从s的第i个字符开始,找它后面的第一个空格。
2. 怎样取到两个空格间的内容作为子串?这当然可以使用mid函数。假如我们找到两个空格,它们在s中的位置分别为第4位和第7位,那么我们就可以使用 mid (s,4 1,7-4-1) 取出二者之间的内容。为什么是4 1呢?因为第4位是空格,所以我们要从它的下一位开始取内容。那么为什么第三个参数是7-4-1呢,因为mid函数第三个参数代表的是要取出的字符个数,所以大家可以自己心算一下,4和7之间夹着的字符(也就是5和6位的字符),长度是不是 7-4-1? 现在我们把这个规律抽象一下,假设两个空格的位置分别是 a 和 b,那么我们就应该使用 mid(s,a,a b-1)来取出ab之间的内容。
3. 怎样重复上述步骤1和2?当然就是用循环了。
OK,现在我们看一下示例代码:
为了让大家看的更清楚,杨老师给上面的代码做了详细的注释;大家可以把下面这个图片放大后阅读:
根据多年教学经验,杨老师相信大多数同学看到上述代码后一定会犯晕,并且需要很长时间才能想通。大家不用担心,这种情况很正常,因为字符串处理本来就是初学者最犯愁的部分。但只要大家拿出一个小时的时间,把这段代码写到自己的excel中,用单步调试功能一步步跟踪执行,每执行一步就观察一下各个变量,并思考为什么会走到这里,最终一定能够想通整个过程。这种锻炼对大家掌握字符串函数,从而处理复杂文本任务,具有非常高的价值。
最后再说明一点,上述示例是一个简化版的任务,其中一些地方并不完善。比如当出现连续空格时,两个连续空格中间的内容,即“空字符串”,也被认为是一个子串并显示出来(其实Split函数默认情况下也是这样的);此外我们的例子中,分隔符只是一个字符(空格),而不是多个字符构成的字符串(比如“我是分割线”)。不过只要大家把这段代码想清楚,就会有能力通过几个小改动,完善这几个功能。
如果大家感兴趣,我们还可以只利用mid函数而不使用instr,实现同样的拆分功能,并且避免前面说的把连续空格之间的空字符串也取出来的问题。代码如下,请感兴趣的同学自己思考。