MATLAB批量读取多份Excel/CSV文件无需创建独立变量的方法
原代码错误点拆解
- 序号转换逻辑完全错误:代码中使用
char(i)拼接文件名,MATLAB里char(数值)的作用是把输入值按ASCII码规则转成对应字符,比如i=1时,转换结果是不可见的ASCII控制符,根本不是预期的字符'1',拼出来的文件名和实际存储的文件名完全不匹配,自然出现序号识别错误的问题。 - 存储类型不匹配:
readtable返回的是表格类对象,不能用普通数值数组的索引方式(如t(i)=xxx)直接存储,强行赋值会触发类型不匹配的报错。
无需独立变量的批量读取实现方案
方案1:元胞数组存储(全版本通用,稳定性最高)
通过预分配定长元胞数组承接所有读取的表格,全程不需要为每个文件单独创建独立存储变量:
% 预分配1行20列的元胞数组,避免循环过程中动态扩容降低运行效率 t = cell(1, 20); for i = 1:20 % 正确将数字序号转为对应字符串,拼接出实际文件名 m = [num2str(i), ".csv"]; % 增加文件存在性校验,避免缺文件直接中断程序 if ~isfile(m) warning("序号为%d的文件不存在,已跳过", i); continue; end % 将读取到的表格存入元胞的对应位置 t{i} = readtable(m); end
后续调用时,直接通过t{序号}即可访问对应文件的内容,比如对比第3份和第7份文件时,直接调用t{3}、t{7}完成取值,不需要单独访问t1、t2这类独立变量。
方案2:多维table数组存储(适配R2019a及以上版本)
如果MATLAB版本支持多维table类型,可以直接按原生表格数组结构存储,类型一致性更好:
% 预分配带第三维维度的空table占位 t = table.empty(0, 0, 20); for i = 1:20 m = sprintf("%d.csv", i); if ~isfile(m) warning("序号为%d的文件不存在,已跳过", i); continue; end t(1,1,i) = readtable(m); end
后续通过t(1,1,i)即可访问对应序号文件的内容。
实操注意事项
- 不要使用
char(数字)做序号转字符串操作,统一用num2str()、sprintf()或者字符串类型直接拼接数字,从根源上避免序号转错的问题。 - 如果实际存储的Excel/CSV文件名带固定前缀或后缀(如
user_data_1.xlsx),只需要修改文件名拼接逻辑即可,循环框架不需要调整,例如适配该类文件名可改成m = "user_data_" + num2str(i) + ".xlsx"。
内容的提问来源于stack exchange,提问作者itit123
相关产品推荐
相关产品推荐

