记第一次使用Excel进行计算
早就知道Excel强大, 可是始终也没用过什么高级功能. 之前至多是用它来看看SharePoint的ULS日志, 因为Filter功能实在是非常好用.
今天, 在看dump的时候遇到了一个问题, 使用!dumpheap –stat, 在Fragmented blocks larger than 0.5 MB的部分, 看到特别多条记录, 于是就想统计一下这些对象一共占用了多少内存.
问题描述
=================
简化来说, 我从WinDBG的输出中拷贝了类似如下的文字:
0d6998e0 5.2MB 0dbc3218 System.String
111a0598 3.8MB 11577fa8 System.String
0d6998e0 5.2MB 0dbc3218 System.String
111a0598 3.8MB 11577fa8 System.String
0d6998e0 5.2MB 0dbc3218 System.String
111a0598 3.8MB 11577fa8 System.String
0d6998e0 5.2MB 0dbc3218 System.String
111a0598 3.8MB 11577fa8 System.String
0d6998e0 5.2MB 0dbc3218 System.String
111a0598 3.8MB 11577fa8 System.String
0d6998e0 5.2MB 0dbc3218 System.String
111a0598 3.8MB 11577fa8 System.String
0d6998e0 5.2MB 0dbc3218 System.String
我如何才能比较方便地获取第二列的所有的数字之和?
解决方案
=================
1. 首先将该段文字存入一个文本文档.
2. 使用Excel的Data Import From Text功能.
3. 得到这样的excel文件
4. 如果B列全是数字就OK了, 可惜有MB挡路. 先去进行了Google找到了一篇文章Extracting numbers from alphanumeric strings. 看了好久, 终于明白了这篇文章中的技巧. 可是该技巧却不适合我这个应用. 因为小数点的问题并没有被考虑到, 所以该解决方案只适用于数字连续的整数.
5. 本来我是不会使用Excel公式的, 看了上面的文章, 就明白了一点, 自己摸索一下, 就解决了我的问题. 其实我面临的问题更加简单, 只需要扣掉后面的MB, 然后再累加即可.
6. 先使用我们需要得到的是B列的一个子串, 该子串从母串的首字母开始, 长度是母串的长度减去2("MB"的长度). 得到了子串后, 需要让其乘1, 以转型为数字. 公式如下:
=1*MID(B1,1,LEN(B1)-2)
7. 接下来使用AutoFill来填满结果列的全部.
8. 得到了数字, 剩下的事情就简单罗, 一个SUM搞定.
参考资料
Extracting numbers from alphanumeric strings