MATLAB表格数据处理实操readtable/writetable玩转Excel/TXT(新手到进阶,包含MATLAB 2025下载安装激活教程)

140 阅读9分钟

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);
  • 解决方案:指定编码为GBKUTF-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