matlab导出csv文件多种方法实现

觉得有用的话,欢迎一起讨论相互学习~

作为一名python 粉丝,csv是我最喜欢的文件格式。那么 如何将matlab中的变量保存为csv?

示例

有一个51*2的矩阵,我们将其列表头分别记为Obj1和Obj2,而行表头为1-51。将这个矩阵输出到csv中。

csvwrite方法

挺好用的

% Write a comma-separated value file.

csvwrite(FILENAME,M);% writes matrix M into FILENAME as comma-separated values.

csvwrite(FILENAME,M,R,C);%writes matrix M starting at offset row R, and column C in the file.

R,C分别表示写入的行数R和列数C,并且左上角被认为是(0,0)

csvwrite('1.csv',data)

如果1.csv不存在会建立一个这样的文件

java csv导出不用逗号分隔 java实现导出csv文件_matlab导出java

csvwrite('1.csv',data,1,1)

java csv导出不用逗号分隔 java实现导出csv文件_数据_02

dlmwrite方法

好用,并且能够在不覆盖原有数据的方式,在行后进行添加

dlmwrite('test.csv',data(1,:),'delimiter',',');

dlmwrite('test.csv',data(2,:),'delimiter',',','-append');

dlmwrite('test.csv',data(3,:),'delimiter',',','-append','roffset',2,'coffset',2);

分别表示

将第一行加到test.csv中,并且以逗号为分隔符

将第二行加到test.csv中,并且从行后添加

将第三行加到test.csv中,并且以相对于已有数据偏移的方式

java csv导出不用逗号分隔 java实现导出csv文件_java csv导出不用逗号分隔_03

writetable方法

writetable方法给予了很大的发展空间,按列进行保存。好用!

% 可以设置行名称

% 首先创建一个1-n的列向量,具体为行向量的转置

BD1=1:51;

BD2=BD1.';

% 列名称

title={'NO','obj1','obj2'};

%生成表格,按列生成

% VariableNames 参数用于设置列头

result_table=table(BD2,data(:,1),data(:,2),'VariableNames',title)

% 保存数据

writetable(result_table, '2.csv');

java csv导出不用逗号分隔 java实现导出csv文件_字符串_04

java csv导出不用逗号分隔 java实现导出csv文件_matlab导出java_05

fprintf方法

fprintf函数不仅可以向csv文件中输入数据,可以向各种文件中输入数据,是最万能的方法!也是灵活程度最高的方法。

踩雷

fprintf 不支持元组

% 注意fprintf不支持元胞数组

title={'NO','obj1','obj2'};%这样写会报错

fprintf(fid,'%s,%s,%s\n',title(1),title(2),title(3));

% 参数3有误

为此将其元组转换为矩阵试试

% 注意fprintf不支持元胞数组

title={'NO','obj1','obj2'};%这样写会报错

% fprintf(fid,'%s,%s,%s\n',title(1),title(2),title(3));

fprintf(fid,'%s,%s,%s\n',cell2mat(title(1)),cell2mat(title(2)),cell2mat(title(3)));

将元组转换为矩阵真好

% Create a csv file

fid=fopen('test2.csv','a');

BD1=1:size(data,1);% size(x,1)表示行数,size(x,2)表示列数

if fid<0

errordlg('File creation failed','Error');

end

% 注意fprintf不支持元胞数组

title={'NO','obj1','obj2'};

% fprintf(fid,'%s,%s,%s\n',title(1),title(2),title(3)); % 这样写会保错

fprintf(fid,'%s,%s,%s\n',cell2mat(title(1)),cell2mat(title(2)),cell2mat(title(3)));

% 一共有51行

for i=1:size(data,1)

fprintf(fid,'%d,%d,%d\n',BD1(i),data(i,1),data(i,2));

end

fclose(fid);

java csv导出不用逗号分隔 java实现导出csv文件_matlab导出java_05

fprintf字符串矩阵

对于注意fprintf不支持元胞数组,还有一种思路,就是使用字符串矩阵表示表头

刚开始我是下面这样写的

title=['NO','obj1','obj2'];

fprintf(fid,'%s,%s,%s\n',title(1),title(2),title(3));

java csv导出不用逗号分隔 java实现导出csv文件_数据_07

可以看到这种方式把title当做整个字符串,而title(1),title(2),title(3)其实是前三个字母

java csv导出不用逗号分隔 java实现导出csv文件_matlab导出java_08

因此以下才是正确的处理方式

更改fprint中的索引

title=['NO','obj1','obj2']; fprintf(fid,'%s,%s,%s\n',title(1:2),title(3:6),title(7:10));

% Create a csv file

fid=fopen('test2.csv','a');

BD1=1:size(data,1);% size(x,1)表示行数,size(x,2)表示列数

if fid<0

errordlg('File creation failed','Error');

end

% 注意fprintf不支持元胞数组

title=['NO','obj1','obj2'];

fprintf(fid,'%s,%s,%s\n',title(1:2),title(3:6),title(7:10));

% 一共有51行

for i=1:size(data,1)

fprintf(fid,'%d,%d,%d\n',BD1(i),data(i,1),data(i,2));

end

fclose(fid);