MATLAB:Excel数据提取与处理
关于
起因:公司给了我大半年的导航接收机数据,数据文件夹的存储格式大体为:数据包->月->日->通道->数据.csv,希望提取需要的参数,然后按通道整合,最后分析处理。当然,公司的期望是一个通用性的数据分析软件。
备注:小白。少说话,多说易出事。
环境
MATLAB 2011(后迫于无奈使用MATLAB 2017) ;office 2010
一看就存在的难点
- 多级文件夹,如何一次性拉出所有的csv文件;
- 数据文件极多,如何读写能加快速度;
- 部分数据格式有所不同,如何自动区别;
- 如何呈现散点图能更好的显示趋势。
整容不是必要的
第一步:获得黑名单-拉出所有待处理的CSV文件
将数据文件都变成整容脸,使他们的名字大体相同,区别用序号代替,这样就可以循环读取了呀!这样的形式我在做视觉物联网作业的时候是用过的(参看往期文章)。但问题来了,我要对他们整容,我也得先找到他们才行,可我找到了他们,我不就知道了他们的地址了吗?!
【前期:采用cmd的ren命令对部分数据文件进行了重命名,做完了发现并没有意义。】
我在知识的海洋里遨游,游着游着便发现我要的那条鱼,于是,再经过简单烹饪后,他便成为了我的盘中餐,通过这个函数我成功拉到了数据包下的所有csv文件(emmm,大概也就4000多个数据文件,1000000多条数据而已)。
事实证明,整容不是对什么都适用。
统一服装容易管理
第二步:处理黑名单-提取所需的参数
原数据文件中含有100+个参数,而我们只需要时间+关键的六个参数,所以去繁从简十分重要。大家穿的都很多,但大致分为两种冬日着装,所以不能下统一的命令,如,把第几件外套脱掉,把第几条裤子留下。这时候,只好采用匹配的方法,告诉他们,如果你穿了黑色彪马外套、黑色彪马裤子、黑色彪马鞋子(不瞒大家说,李现穿着真帅!),请继续穿着它,其余的请脱掉。至此,大家的服装统一了。
为了不使处理后的数据是去原有时间等信息,我将其放在原数据同一个文件下。这里采用的方式是:使用strrep函数替换掉.csv,并命名新的数据文件名为原名+analysis.csv。
不做不会发现的问题
- MATLAB 2011没有table函数;
- table函数各参数长度须一致;
- Excel文件占用空间大且MATLAB处理慢(不完全统计:Excel三秒一个,csv一秒三个);
- MATLAB写csv文件时文本与数字不能一起写入;
- MATLAB与Excel的数值日期起始时间不一致;
- 有一些0kb的伪装文件;
- 某一天起,多了几个通道;
- 还没解决的问题:MATLAB读取CSV文件中的日期后再次写入Excel自动转化为数值日期,MATLAB读取数值日期时,却不会转化为日期格式。
地方官上线
第三步:归类黑名单-按通道整合数据
在这里,主要是将不同出生日期的按照地方整合到一起,即同个通道的数据整合成一个数据文件。具体操作如下:
拉取所有的csv文件目录,同过目录中的关键字判断数据属于哪一个通道(使用strfind函数),然后将对应的参数存入对应的矩阵,保存矩阵,并将矩阵写入csv。
总是存在那么多陷阱
- 忘了现在数据包下有原始数据的csv与处理后的csv文件;
- 部分文件最后一条数据残缺;
- 匹配通道时忘了区分通道1与通道10等,导致通道1*全都写入通道1;
- 直接使用save函数保存所有矩阵时,由于在GUI下,保存了figure,导致load矩阵时会弹出一个新的figure,而且而且,报错;
排好队,等检阅
第四步:通过绘制散点图观察数据
观察汇总后每个通道的数据,多则8w+,少则2k+,如果将所有的数据绘制在一张图里,点过于密集,难以查看,于是,采用每1000/2000条数据绘制一张散点图。使用MATLAB画图的好处是,可以缩放!能让你想看哪看哪!
领导说,把图存在word里,于是,我这么做了。粗粗一算,8w+条数据按照2000分割的话,每条数据六个参数,也就是240+张图,也不是太多哈。
trouble is a friend
- 绘制散点图时,直接使用plot(日期,数据)横轴无法显示日期,后来采用set(gca,‘xticklabel’,日期);
一点点优化
- 筛选不同通道使用下拉框;
- 绘制采用两种模式:绘制所有与绘制选定长度的数据;
- 存储异常数据文件;
- GUI打包(听说没有MATLAB的电脑还得下环境,这不太友好)。