如何用低I/O命令导入CSV至MATLAB?FileID异常递增及表格生成问题
问题原因
- 文件句柄未释放:每次运行代码时调用
fopen打开文件,但从未用fclose关闭,系统会持续分配新的文件句柄,因此FileID会逐次递增(1、2、3...)。 - fgetl参数错误:
fgetl的输入参数应为fopen返回的文件句柄FileID,而非文件名Filename,原代码这一步并未正确读取表头。 - 未读取数据行:现有代码仅尝试读取表头,没有编写逻辑读取后续524行的3列数据,自然无法生成包含所有数据的表格。
解决方法及修正代码
以下是修正后的完整代码,包含正确的文件打开、表头读取、数据读取和文件关闭逻辑:
Filename = 'Text.csv'; FileID = fopen(Filename, 'r'); if FileID == -1 error('无法打开文件,请检查路径或权限'); end % 读取表头 Header = fgetl(FileID); % 读取3列524行的数值数据(假设CSV内容为逗号分隔的数值) data = fscanf(FileID, '%f,%f,%f\n', [3, 524]); data = data'; % 转置为524行3列的矩阵 % 关闭文件,释放句柄 fclose(FileID); % 可选:将数据转为表格(如果需要) resultTable = array2table(data, 'VariableNames', split(Header, ','));
代码说明
- 添加文件打开失败判断:若
fopen返回-1,说明文件不存在或权限不足,直接抛出错误提示。 - 修正
fgetl参数:传入正确的文件句柄FileID读取表头。 - 用
fscanf按CSV格式读取数据:%f,%f,%f\n匹配每行3个逗号分隔的浮点数,指定输出维度[3,524]后转置为行优先的矩阵。 - 操作完成后必须调用
fclose(FileID),释放文件句柄,避免后续运行时FileID持续递增。 - 可选步骤:用
array2table将矩阵转为表格,并用表头拆分后的字符串作为列名。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

