MATLAB向CSV文件追加新数据行的操作报错与实现问题
报错根因定位
csvwrite仅支持纯数值矩阵输入,不兼容table类型与字符串内容,传入table对象时会触发Undefined function 'real' for input arguments of type 'table'报错,该函数本身不适用于带文本的CSV写入场景。writetable的官方入参顺序为「待写入table对象 → 输出文件路径」,将文件路径作为第一个入参、table对象作为第二个入参时,会触发参数类型校验报错:Error using writetable (line 124) Input must be a row vector of characters or string scalar。- 直接执行
file = [file; newline]垂直拼接时,读入的0×10空表会被Matlab自动推断为全double类型列,与传入的字符串元胞列类型不匹配,拼接结果存在结构合法性问题。 - 用
dlmwrite写入元胞数组时,函数会将元胞内的字符向量按单字符拆分作为独立列,无法实现“每个元胞元素对应一列”的写入效果。
标准实现流程
- 空表列类型适配
读入空表后,将所有列的类型从默认推断的数值类型转换为字符串类型,匹配后续待追加的文本数据:% 读入原始空CSV file = readtable('~/.../file.csv'); % 批量转换全表列类型为字符串 for col_idx = 1:width(file) file.(col_idx) = strings(height(file), 1); end - 结构化追加新行
将待写入的10元素元胞数组转换为与现有表列名完全对齐的单行table,再执行垂直拼接,避免列名、列类型不匹配问题:% 定义待追加的字符串行 newline = {'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten'}; % 元胞转table,沿用原表的列名 newline_row = cell2table(newline, 'VariableNames', file.Properties.VariableNames); % 完成表行拼接 file = [file; newline_row]; - 按规范参数顺序写入文件
调整writetable的入参顺序,根据是否需要保留col1-col10的列名表头,决定是否添加WriteVariableNames参数:% 正确入参顺序:table对象在前,文件路径在后 % 若不需要写入列名表头,添加'WriteVariableNames', false参数 writetable(file, '~/.../out.csv', 'WriteVariableNames', false);
内容的提问来源于stack exchange,提问作者francoiskroll
相关产品推荐
相关产品推荐

