搞科研、做分析,谁还没被Excel和MATLAB之间那道看不见的墙给折磨过?一个Excel,一个MATLAB,两两相望,数据就是倒不进去。或者说,倒进去了,但面目全非,根本不是你想要的样子。这事儿吧,说难不难,但里面的门道和坑,足够让一个新手抓狂一下午。
今天,我就不跟你扯那些官方文档上干巴巴的说明了,咱们聊点实在的,聊聊我是怎么从一个只会右键“导入数据”的菜鸟,一路摸爬滚打,到现在能把各种奇形怪状的Excel表格收拾得服服帖帖的。
最初的幻想:那个叫“导入数据”的温柔陷阱
每个MATLAB新手,第一次面对Excel数据时,八成都会被主页上那个大大的 导入数据 按钮所吸引。点一下,弹出一个文件选择框,选中你的Excel文件,然后,哇,一个漂亮的图形界面出现了,数据预览、变量名,看起来一切尽在掌握。你可以用鼠标拖拖拽拽,选择要导入的区域,定义变量类型,最后点一下“导入所选内容”,数据就乖乖地躺在你的工作区里了。
是不是觉得很简单?第一次成功的时候,我也这么觉得。直到我遇到了“现实”。
现实是,你的导师、你的同事扔给你的Excel,根本不是教科书里那种干干净净的表格。它可能是: * 表头有两三行,甚至还有合并单元格。 * 数据中间夹杂着各种中文、注释、甚至是“N/A”、“空”这样的奇葩占位符。 * 日期格式千奇百怪,有“2023/10/26”,有“2023-10-26”,还有“Oct-26”。 * 一个文件里有好几个Sheet,你需要从每个Sheet里取特定的一块数据。
这时候,你再点那个 导入数据 按钮,就会发现事情开始变得诡异。MATLAB可能会把你的数字列识别成文本,或者把你的表头当成数据,导入结果一塌糊涂。更要命的是,如果你有100个这样的文件要处理,难道要手动点100次?自动化处理的梦想,在这一刻,碎了一地。
所以,这个图形化工具,我的建议是:玩玩可以,别当真。它只适合处理那些格式极其规整、一次性的数据导入任务。要想真正驾驭数据,我们必须深入代码的腹地。
进入正题:readtable,现代MATLAB的王牌
忘了那个老掉牙的xlsread吧。虽然很多旧代码里还在用它,但官方早就嫌弃它了,不仅慢,而且在不同操作系统(尤其是没有安装Excel的Linux或Mac)上表现得像个没睡醒的醉汉。从R2013b版本之后,MathWorks就推出了一个全新的、功能极其强大的函数:readtable。
readtable,顾名思义,就是把表格文件读成一个MATLAB里的table数据类型。这个table类型本身就是个神器,它允许每一列是不同的数据类型(数值、文本、日期等等),并且每一列都有自己的名字,简直就是为处理异构数据而生的。
最基础的用法,简单到不行:
matlab
T = readtable('your_data.xlsx');
就这一行,你的Excel数据就变成了一个名为T的table变量。你可以像操作结构体一样访问它的列,比如T.ColumnName,也可以像操作矩阵一样进行索引,比如T(1:5, 1:3)。
但readtable的精髓,在于它那一大堆“名-值”对参数。正是这些参数,给了我们随心所欲定制导入过程的能力,能把那些妖魔鬼怪般的Excel文件驯服。
我们来模拟几个真实场景,看看 readtable 是如何大显神通的。
场景一:表头不是第一行,怎么办?
很多实验记录的Excel,第一行可能是个总标题,第二行是“实验日期:XXX”,第三行才是真正的列名。这时候直接readtable,MATLAB会把总标题当成列名,整个数据都错位了。
别急,readtable早就想到了。
matlab
% 假设真正的列名在第3行,数据从第4行开始
opts = detectImportOptions('your_data.xlsx');
opts.DataRange = 'A4'; % 告诉它数据从A4单元格开始读
opts.VariableNamesRange = 'A3'; % 告诉它列名在A3那一横排
T = readtable('your_data.xlsx', opts);
看,这里我们用了一个辅助函数detectImportOptions,它能先去“侦察”一下Excel的结构,生成一个导入选项对象opts。然后我们就可以像玩乐高一样,去修改这个opts的各种属性,最后把它作为配置单交给readtable去执行。这种方式,比直接在readtable后面跟一长串参数要清晰得多,也更强大。
场景二:我只要其中几列,或者某个特定区域
数据文件巨大,我只关心“温度”和“压力”这两列,或者我只要第100行到第200行的数据。
简单!用'Range'参数,简单粗暴。
matlab
% 只读取B2到D101的矩形区域
T = readtable('your_data.xlsx', 'Range', 'B2:D101');
如果你只想读特定的Sheet,也没问题:
matlab
% 读取名为'Sheet2'的工作表
T = readtable('your_data.xlsx', 'Sheet', 'Sheet2');
场景三:数据类型识别错误,这是最要命的!
这是一个深坑。你的某一列明明是数字,但里面混进了一个“N/A”的文本,readtable为了安全起见,可能会把整列都识别成文本(cell array of char vectors)。这样一来,你就没法直接对它进行数学计算了。
这时候,'VariableTypes' 这个参数就是你的救命稻草。
matlab
opts = detectImportOptions('your_data.xlsx');
% 假设前三列分别是数字、文本、数字
opts.VariableTypes = {'double', 'string', 'double'};
T = readtable('your_data.xlsx', opts);
你可以强制指定每一列的数据类型。更妙的是,MATLAB会自动处理那些不符合指定类型的数据。比如,在一个你指定为'double'的列里,如果遇到了“N/A”或者空格,它会自动替换为NaN(Not-a-Number),这正是我们在科学计算中最希望看到的结果!NaN可以参与计算而不会报错,并且很容易被函数(如isnan, fillmissing)识别和处理。这简直是 数据清洗 的第一步,而且是全自动的。
场景四:我的Excel里日期格式乱七八糟
readtable对日期的处理也相当智能。它通常能自动识别常见的日期格式,并将其转换为MATLAB的datetime类型。如果它识别不了,你也可以通过设置opts.VariableTypes中对应列为'datetime',并进一步指定'InputFormat'来帮助它。
matlab
opts = detectImportOptions('your_data.xlsx');
% 假设第一列是日期,格式为 'dd-MMM-yyyy' (例如 26-Oct-2023)
opts = setvartype(opts, 'DateColumnName', 'datetime', 'InputFormat', 'dd-MMM-yyyy');
T = readtable('your_data.xlsx', opts);
掌握了detectImportOptions和readtable的组合拳,基本上90%的Excel导入问题都能迎刃而解。这套操作的核心思想是:不要相信MATLAB的自动判断,要主动告诉它你的数据是什么样的。
终极武器:当文件太大或太多时,请出spreadsheetDatastore
有时候,你会遇到单个Excel文件就有几个GB,或者一个文件夹里有成百上千个结构相同的Excel文件。这时候,如果你还用readtable一次性把所有数据都读入内存,那你的电脑可能会伴随着风扇的狂吼,给你一个“内存不足”的惨痛教训。
这时候,就该轮到 spreadsheetDatastore 登场了。
datastore,数据存储,你可以把它想象成一个指向数据源的“管道”,而不是数据本身。它知道数据在哪里、长什么样,但它不会立刻把水(数据)全部放出来,而是你用一点,它就流一点。
matlab
% 创建一个指向文件夹中所有.xlsx文件的数据存储
ds = spreadsheetDatastore('path/to/your/folder/*.xlsx');
这个ds对象现在就代表了你文件夹里所有Excel文件的数据。它几乎不占用什么内存。然后,你可以像配置readtable一样去配置它。
matlab
ds.SelectedVariableNames = {'Temperature', 'Pressure'}; % 只选择这两列
ds.NumHeaderLines = 2; % 跳过前两行表头
配置好了之后,怎么读取数据呢?你可以用read函数一块一块地读,也可以用readall一次性(如果确定内存够的话)读完。最优雅的方式,是结合while循环。
matlab
data_all = [];
while hasdata(ds)
T_chunk = read(ds); % 一次读取一块(具体多大可以配置)
% 在这里对T_chunk进行处理
% ...
data_all = [data_all; T_chunk]; % 将处理后的数据块拼接起来
end
这种 分块处理 的模式,对于大数据分析和处理海量文件来说,是绝对的王者。它让你的MATLAB程序能以有限的内存,去处理远超内存容量的数据,这是一种思想上的飞跃。
写在最后:从“能用”到“好用”
从图形界面的导入数据,到命令行王者readtable,再到处理大数据的spreadsheetDatastore,这是一条从入门到精通的必经之路。
关键不在于记住每一个函数的每一个参数,而在于理解背后的逻辑:为什么要写代码来导入数据?
答案是:为了可重复性和自动化。
你想想,一个脚本写好,以后成百上千个格式一样的Excel文件,一键运行,数据唰唰唰地就进来了,图都给你画好了,这感觉,不香吗?这才是MATLAB作为一门工程语言,真正强大的地方。它把我们从繁琐、重复、易错的手动操作中解放出来,让我们能专注于数据分析和算法本身。
所以,下次再面对一个Excel文件时,别再下意识地去点那个“导入数据”按钮了。打开你的编辑器,敲下T = readtable(...),开始你真正的MATLAB数据之旅吧。这条路一开始可能有点崎岖,但相信我,走过去,前面是星辰大海。
【怎么把excel的数据导入matlab】相关文章:
excel在表格里怎么画线条02-04
excel怎么做汇总表02-04
excel的数据怎么倒过来02-04
Excel怎么保存JPG格式的文件02-04
怎么把Word导入到Excel,这标题听着就让人头疼。02-04
excel的顿号怎么打出来02-04
怎么把excel的数据导入matlab02-04
excel的表头怎么固定不动02-04
两个Excel怎么同时打开?02-04
excel表格怎么分单元格02-04
怎么做excel乘法表02-04
excel怎么做结构图02-04
恢复损坏的excel文件怎么恢复02-04