全部学习汇总: GreyZhang/g_matlab: MATLAB once used to be my daily tool. After many years when I go back and read my old learning notes I felt maybe I still need it in the future. So, start this repo to keep some of my old learning notes servral years ago. (github.com)
首先说明,我并不专业,但我对这些东西确实是感兴趣。在这方面,我也没有接受过专业的培训或者学习,我只是自己折腾了一下,多少有点了解。现在网络上有一种称呼叫做“野生程序员”,我觉得我自己基本就是那么一个角色。我很期待跟路过此文的朋友们进行相应的交流探讨,那也将会让我有很大的受益。当然,如果有错误的话及时给我指正,我将会十分感激!
我的邮箱:greyzhang@126.com
本想整理一下MATLAB、Perl、Python三种语言处理Excel的方式以及他们之间的优缺点,整理了一半发现这工作量实在太大。最近工作确实是有点忙,闲暇之余也很难有足够多的时间。想了一下,换个方式或许会更好些。抽取能够拿得出的空余时间把三种处理Excel的方式简单的描述一下,做几个简单的示范先积累下素材。至于这之间的差异,看过三部分的素材之后相信我已经把我能够了解的东西展示了出来,互相对比一下也就能够看出在我理解掌握的角度来看,我到底对这些差异有什么样的体验。
我觉得MATLAB在Excel的处理上属于简约派,因为它的数据处理能力固然强大但是我们强行也把那部分划归到MATLAB对Excel的功能支持稍微有些牵强了。不过,这确实不是重点。其实,我介绍的这几个函数接口都是调用了微软Office的软件。这一下子就说出了一个很重要的短板了吧!是的,你得有银子!不仅需要买价格昂贵的MATLAB,还需要买Windows,还需要Office的Excel。因此,通常情况下这种方式只有在公司的时候才会用。不过,它有一个很好的地方是对数据重写的支持,也就是对同一个单元格的多次写入。听起来似乎没什么大不了的,就是重写两次嘛!如果回到家,你没有了MATLAB以及Excel,用上Perl或者Python时,这就是你的噩梦。当然,那时候我们还有其他的解决方案。
在处理Excel的时候,其实核心就三部分读、写加上内容的处理。关于内容的处理,这跟使用的工具是绑定的,都是MATLAB、Perl或者Python的基本程序设计。而阻碍大家实现处理功能的其实就只有读和写。我说MATLAB是简约派是因为关于读写,掌握两个函数基本就够用了,掌握三个基本就是加强版的水准了。目前为止,我用到的函数没有超过三个的情况。
三个函数之一:xlsfinfo
我用到这个函数的时候一般是因为我不知道Excel中有多少个Sheet页或者不知道Sheet页的名字,用这个函数可以获取到这部分信息。比如,我将要处理图1中当前目录下的data.xls文件,现在我想获取它到底有几个Sheet页,分别是什么名字:
图1
如果不打开Excel文件,我可以直接使用以下语句实现相关信息的读取(图2)。
图2
第一个语句:[~,sheets] = xlsfinfo('data.xls');
它的作用是把Excel的数据全都加载到WorkSpace。这里面用到的接口原型是[status,sheets] = xlsfinfo(filename),其中status我用不到设置成了缺省。查一下MATLAB的文档会看到这个接口有三种原型,这跟C语言很不一样,但是用过Python或者C#的肯定熟悉。不同于C语言,MATLAB中的函数式可以重载的。
第二个语句:sheet_number = length(sheets)
它的作用是判断到底有几个Sheet页,使用了比较常用的length()函数。length()函数的参数也是可以重载的,可以接受几种不同类型的参数。这样看来,虽说MATLAB是简约派,但是其实是表面上的简约但是内功确实比较深厚。在这个语句输入的时候,我故意没有加结束时候的分号,这样就可以在命令窗口直接看到输出的结果。如果是写脚本或者程序,最好还是有print函数。一共有几个Sheet页,在WorkSpace中可以直接看到,这里保存了运行过程中所有的变量信息以及执行结果。不过,写脚本或者程序的时候我们肯定看不到。鉴于通用性,加入了length()函数。
第三个语句:
for i = 1 : sheet_number
sheets(1,i)
end
这是一个MATLAB的for循环,如果是写代码文件当然还得考虑一下排版。一般情况下,MATLAB的自动缩进就是一个很好的排版风格。这里重复执行的语句同样没有加分号,所以在命令窗口能够看到输出的结果(图3)。
图3
三个函数之二:xlsread
在很长的一段时间内,处理Excel文件我只会这一个函数。通常,我的工作是根据Excel文件中的信息处理处一个结果。这样,我其实只需要能够把Excel文件的信息导入到WorkSpace就已经万事大吉了。如果接着上面的操作继续,我们已经知道Sheet页中有一个data页,我们想把这部分读取出来。那么使用这个函数就可以完成。这里把Excel中的数据以三种方式读了出来:数字、文本、全部的原始数据。从图4,5,6中可以看到这些数据的一部分展示(嗯,是的,这里是通过其他的方式从我的博客爬取了一部分信息。把我这些年写的博客中的访问量超过50的博客全都搜集了一下。最近的确是对数据分析感兴趣,我想做个试验看看我能否通过数据分析确定热门主题然后定向导入我的博客,看看是否能够让我的博客在一年的时间中访问量超过过去5年。我觉得这会是一个很有意思的分析试验。)。
需要注意的是,如果单独以数字或者文本的形式处理数据的时候,如果Excel的内容控制不够好会丢失很多信息。如果以原始数据处理,那将会导致算法的复杂化。如果想快速处理出自己想要的结果,过去的经验告诉我最好是把数字设置为文本格式。这样,脚本将会是最简单的,不过确实是把难题扔给了Excel的管理者。在我接触了大数据的分析之后,我发现这确实是一个不太好的思维。写个简单的小脚本使用文本固然还能凑合,但是倘若遇到大数据,与数字存储相比。文本不仅意味着更多的存储资源,也意味着更慢的处理速度以及效率更低的算法。到底选择什么方式,其实这跟我们使用的场合还是很相关的。通常使用文本足以应付,我们写的脚本处理成百上千个数据其实最多也就是那么几秒钟的事儿。
图4
图5
图6
这部分就介绍了这一个语句,够简单。而数据的处理其实就是简单的M语言编程,常用的莫过于数学运算以及字符串处理。如果需要使用正则表达式,那就算得上是高级操作了。
三个函数之三:xlswrite
再接着上面来吧!我们把读出来的原始数据信息写入到一个新的名叫test.xls的Excel文件中名叫new_data的Sheet页(图7)。
图7
成功写入了信息,而且多次重复写入不会出现任何问题。如果做一下尝试你会发现,这个函数的“重写”其实不是重写功能,而是修改!这是Perl、Python等处理的时候没有的一种很不错的体验。不过我个人很不建议重写操作,因为这个需要不断把数据写入硬盘,速度实在是太慢了!因此,在处理数据的时候最好的方式是把所有的信息在MATLAB中以矩阵的方式处理,处理结束后以矩阵的方式一次性写入。每次增加sheet页的时候,会出现一个警告。如果打开生成的Excel,也会很有意思的发现里面还有其他的Sheet页。这是因为这个过程本质上就是在调用微软的Excel程序,而这种现象也是Excel程序的一种动作继承。如果在脱离了微软office的Perl或者Python处理库做相应操作时确实是干净利落的多。
最后,打开生成的Excel看一眼(图8):
图8
结束语:
相信整个处理的过程大致还是提到了,至于中间数据的处理有着灵活的方法。这个到底怎么来处理因人而异了。
想到了我前文中提到的分析,其实MATLAB肯定能够做这个分析,小菜一碟儿!不过分析是我的问题啦!