MATLAB的readtable()和writetable()是处理结构化表格数据的核心函数——无需手动解析文本、无需复杂的Excel COM接口,就能一键读取/写入Excel、TXT等格式的表格数据,是科研数据分析、工程数据处理的必备技能。本文从实际场景出发,详解这两个函数的用法、参数配置、数据清洗和实战技巧,新手也能快速落地。
MATLAB 2025下载安装激活教程:点击查看
一、核心认知:为什么用readtable/writetable?
MATLAB早期处理表格数据依赖xlsread()/xlswrite()(已逐步废弃),而readtable()/writetable()是MATLAB R2013b及以上版本的官方推荐方案,核心优势:
- 兼容性强:支持Excel(.xlsx/.xls)、TXT(.txt/.csv)、JSON等多种格式;
- 结构化存储:读取后的数据以
table类型存储,支持列名索引、数据筛选、类型转换; - 参数灵活:可指定读取范围、跳过表头、设置缺失值填充规则;
- 跨平台友好:无需安装Microsoft Excel(纯MATLAB引擎解析),Linux/Mac/Windows通用。
快速上手:基础语法
% 读取表格数据(核心)
T = readtable('数据文件路径');
% 写入表格数据(核心)
writetable(T, '输出文件路径');
二、readtable():读取表格数据(Excel/TXT核心用法)
readtable()的核心是将外部表格数据转为MATLAB的table对象,以下按文件格式拆解高频用法。
1. 读取Excel文件(.xlsx/.xls)
Excel是科研/工程最常用的表格格式,readtable()可精准控制读取范围、表头、数据类型。
(1)基础用法:读取整个Excel文件
% 读取当前目录下的data.xlsx,默认读取第一个工作表
T = readtable('data.xlsx');
% 查看表格基本信息
disp('表格大小(行×列):');
disp(size(T)); % 输出行数和列数
disp('表格列名:');
disp(T.Properties.VariableNames); % 输出所有列的名称
disp('前5行数据:');
disp(head(T, 5)); % 显示前5行
(2)进阶用法:指定工作表/读取范围
% 用法1:读取指定工作表(如“实验数据2”)
T = readtable('data.xlsx', 'Sheet', '实验数据2');
% 用法2:读取指定单元格范围(如A1:C10)
T = readtable('data.xlsx', 'Range', 'A1:C10');
% 用法3:跳过表头行(如跳过前2行,从第3行开始读取)
T = readtable('data.xlsx', 'TextType', 'string', 'HeaderLines', 2);
% 用法4:指定列的数据类型(如第2列设为数值型,第3列设为字符型)
opts = detectImportOptions('data.xlsx');
opts.VariableTypes{2} = 'double'; % 第2列:数值型
opts.VariableTypes{3} = 'string'; % 第3列:字符串型
T = readtable('data.xlsx', opts);
(3)处理Excel中的缺失值
Excel中的空单元格、#N/A等缺失值,可通过参数指定填充规则:
% 将缺失值填充为0(数值列)/空字符串(字符列)
opts = detectImportOptions('data.xlsx');
opts.ReplaceMissingValues = true; % 开启缺失值替换
opts.MissingValue = 0; % 数值列缺失值填0
opts.MissingString = ""; % 字符列缺失值填空字符串
T = readtable('data.xlsx', opts);
2. 读取TXT/CSV文件(分隔符格式)
TXT/CSV文件的核心是指定分隔符(逗号、空格、制表符等),readtable()可自动识别或手动配置。
(1)读取CSV文件(逗号分隔)
% 基础用法:自动识别逗号分隔
T = readtable('data.csv');
% 进阶:指定编码(如GBK,解决中文乱码)
opts = detectImportOptions('data.csv');
opts.TextEncoding = 'GBK'; % 适配中文Windows系统的编码
T = readtable('data.csv', opts);
(2)读取空格/制表符分隔的TXT文件
% 用法1:空格分隔的TXT(如实验数据.txt)
opts = detectImportOptions('实验数据.txt');
opts.Delimiter = ' '; % 指定分隔符为空格
opts.ConsecutiveDelimitersRule = 'join'; % 合并连续空格
T = readtable('实验数据.txt', opts);
% 用法2:制表符(Tab)分隔的TXT
opts.Delimiter = '\t'; % 分隔符为Tab
T = readtable('数据列表.txt', opts);
% 用法3:无表头的TXT(手动指定列名)
opts = detectImportOptions('无表头数据.txt');
opts.VariableNames = {'序号', '温度', '压力'}; % 自定义列名
opts.HeaderLines = 0; % 无表头行
T = readtable('无表头数据.txt', opts);
3. table对象核心操作(数据提取/筛选/修改)
读取数据后,需对table对象进行处理,以下是高频操作:
(1)列索引(按列名/列号)
T = readtable('data.xlsx');
% 按列名提取列
temp_col = T.温度; % 提取“温度”列(数值数组)
% 按列号提取列
press_col = T(:, 3); % 提取第3列(table类型)
% 提取多列
sub_T = T(:, {'序号', '温度', '压力'}); % 提取指定列
(2)行筛选(条件筛选)
% 筛选温度>25的行
T_filter = T(T.温度 > 25, :);
% 筛选压力在100~200之间且序号<50的行
T_filter = T((T.压力 >= 100) & (T.压力 <= 200) & (T.序号 < 50), :);
(3)数据修改
% 修改指定单元格(第5行“温度”列)
T.温度(5) = 28.5;
% 添加新列
T.温差 = T.温度 - mean(T.温度); % 新增“温差”列(均值差)
% 删除列
T.备注 = []; % 删除“备注”列
(4)数据排序
% 按“温度”列升序排序
T_sorted = sortrows(T, '温度');
% 按“压力”降序排序
T_sorted = sortrows(T, '压力', 'descend');
三、writetable():写入表格数据(Excel/TXT核心用法)
writetable()将MATLAB的table对象写入外部文件,支持自定义输出格式、表头、范围等。
1. 写入Excel文件
% 基础用法:将table写入Excel,默认工作表为Sheet1
writetable(T, '输出数据.xlsx');
% 进阶用法1:指定工作表名称
writetable(T, '输出数据.xlsx', 'Sheet', '处理后数据');
% 进阶用法2:指定写入起始单元格(如从B2开始)
writetable(T, '输出数据.xlsx', 'Range', 'B2');
% 进阶用法3:不写入列名(表头)
writetable(T, '输出数据.xlsx', 'WriteVariableNames', false);
% 进阶用法4:处理中文列名(避免乱码)
opts = detectImportOptions('输出数据.xlsx');
opts.TextEncoding = 'UTF-8';
writetable(T, '输出数据.xlsx', 'TextEncoding', 'UTF-8');
2. 写入TXT/CSV文件
% 用法1:写入CSV文件(逗号分隔)
writetable(T, '输出数据.csv');
% 用法2:写入Tab分隔的TXT文件
writetable(T, '输出数据.txt', 'Delimiter', '\t');
% 用法3:写入空格分隔的TXT文件(指定分隔符)
writetable(T, '输出数据.txt', 'Delimiter', ' ');
% 用法4:写入时跳过缺失值
T_filled = fillmissing(T, 'constant', 0); % 缺失值填充为0
writetable(T_filled, '无缺失值数据.txt');
3. 批量写入多个工作表
% 示例:将不同table写入同一个Excel的不同工作表
T1 = readtable('数据1.xlsx');
T2 = readtable('数据2.xlsx');
% 先写入第一个工作表
writetable(T1, '批量输出.xlsx', 'Sheet', '数据组1');
% 追加写入第二个工作表(关键:WriteMode='append')
writetable(T2, '批量输出.xlsx', 'Sheet', '数据组2', 'WriteMode', 'append');
四、实战案例:完整的数据处理流程
场景:读取实验数据→清洗→分析→写入新文件
%% 1. 读取Excel实验数据(含缺失值、异常值)
opts = detectImportOptions('实验数据.xlsx');
opts.VariableNames = {'序号', '时间', '温度', '压力', '备注'}; % 自定义列名
opts.ReplaceMissingValues = true;
opts.MissingValue = 0; % 数值列缺失值填0
T = readtable('实验数据.xlsx', opts);
%% 2. 数据清洗
% (1)删除异常值(温度>100或<0)
T_clean = T((T.温度 >= 0) & (T.温度 <= 100), :);
% (2)删除空行
T_clean = rmmissing(T_clean);
% (3)格式转换(时间列转为datetime类型)
T_clean.时间 = datetime(T_clean.时间, 'Format', 'yyyy-MM-dd HH:mm:ss');
%% 3. 数据分析
% 计算温度均值、最大值、最小值
temp_mean = mean(T_clean.温度);
temp_max = max(T_clean.温度);
temp_min = min(T_clean.温度);
% 新增“温度等级”列(根据温度范围分类)
T_clean.温度等级 = repmat('中等', height(T_clean), 1);
T_clean.温度等级(T_clean.温度 >= 80) = '高温';
T_clean.温度等级(T_clean.温度 <= 20) = '低温';
%% 4. 写入新Excel文件(分工作表)
% 写入清洗后的数据
writetable(T_clean, '处理后实验数据.xlsx', 'Sheet', '清洗数据');
% 写入统计结果(新建table)
T_stats = table(temp_mean, temp_max, temp_min, ...
'VariableNames', {'温度均值', '温度最大值', '温度最小值'});
writetable(T_stats, '处理后实验数据.xlsx', 'Sheet', '统计结果', 'WriteMode', 'append');
disp('数据处理完成!');
五、避坑指南:新手常见错误
1. 中文乱码问题
- 现象:读取/写入含中文的文件时,列名/内容显示乱码;
- 原因:编码不匹配(Windows默认GBK,MATLAB默认UTF-8);
- 解决方案:指定编码为
GBK或UTF-8:opts = detectImportOptions('中文数据.xlsx'); opts.TextEncoding = 'GBK'; % 读取时 T = readtable('中文数据.xlsx', opts); writetable(T, '中文输出.xlsx', 'TextEncoding', 'GBK'); % 写入时
2. 列名重复/无效
- 现象:读取文件时提示“重复列名”或“无效变量名”;
- 原因:Excel/TXT的表头有重复列名,或包含MATLAB不支持的字符(如空格、特殊符号);
- 解决方案:手动指定列名:
opts = detectImportOptions('数据.xlsx'); opts.VariableNames = {'col1', 'col2', 'col3'}; % 替换无效列名 T = readtable('数据.xlsx', opts);
3. 数据类型错误
- 现象:数值列被识别为字符列,无法计算;
- 原因:数据中包含非数值字符(如“NA”、“--”);
- 解决方案:指定列类型+替换非数值字符:
opts = detectImportOptions('数据.txt'); opts.VariableTypes{2} = 'double'; % 第2列设为数值型 opts.TextType = 'string'; T = readtable('数据.txt', opts); T.温度(strcmp(T.温度, 'NA')) = 0; % 将"NA"替换为0
4. 写入Excel时覆盖原有工作表
- 现象:追加写入工作表时,原有数据被覆盖;
- 原因:未设置
WriteMode='append'; - 解决方案:
writetable(T, '批量输出.xlsx', 'Sheet', '新工作表', 'WriteMode', 'append');
六、进阶技巧:提升数据处理效率
1. 大文件分块读取
处理GB级大表格时,避免一次性读取全部数据,分块读取更高效:
opts = detectImportOptions('大文件.csv');
opts.SelectedVariableNames = {'温度', '压力'}; % 仅读取需要的列
opts.ReadSize = 10000; % 每次读取10000行
reader = textscan(opts); % 创建读取器
while hasdata(reader)
T_chunk = read(reader); % 读取一块数据
% 处理当前块数据(如筛选、计算)
T_chunk_filter = T_chunk(T_chunk.温度 > 25, :);
% 追加写入文件
writetable(T_chunk_filter, '筛选后数据.csv', 'WriteMode', 'append');
end
2. 自定义导入/导出模板
重复处理同格式文件时,保存导入配置为模板,避免重复设置参数:
% 保存导入配置为模板
opts = detectImportOptions('标准格式.xlsx');
saveImportOptions(opts, '标准数据模板.mat');
% 后续使用模板读取
opts = loadImportOptions('标准数据模板.mat');
T = readtable('新数据.xlsx', opts);
3. 结合MATLAB App Designer制作数据处理工具
将readtable()/writetable()封装到GUI中,实现“可视化选择文件→一键处理→导出结果”:
% 简化版GUI回调函数(选择文件按钮)
function selectFile_Callback(hObject, eventdata, handles)
[filename, pathname] = uigetfile({'*.xlsx;*.csv;*.txt', '表格文件(*.xlsx,*.csv,*.txt)'});
if isequal(filename, 0)
return;
end
fullpath = fullfile(pathname, filename);
T = readtable(fullpath);
handles.T = T; % 保存到handles
guidata(hObject, handles);
disp(['已读取文件:', fullpath]);
end
% 导出文件按钮回调
function exportFile_Callback(hObject, eventdata, handles)
[filename, pathname] = uiputfile({'*.xlsx', 'Excel文件(*.xlsx)'});
if isequal(filename, 0)
return;
end
fullpath = fullfile(pathname, filename);
writetable(handles.T, fullpath);
disp(['已导出文件:', fullpath]);
end