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不存在會建立一個這樣的文件
csvwrite('1.csv',data,1,1)
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中,並且以相對於已有數據偏移的方式
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');
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);
fprintf字符串矩陣
- 對於注意fprintf不支持元胞數組,還有一種思路,就是使用字符串矩陣表示表頭
- 剛開始我是下面這樣寫的
title=['NO','obj1','obj2'];
fprintf(fid,'%s,%s,%s\n',title(1),title(2),title(3));
- 可以看到這種方式把title當做整個字符串,而title(1),title(2),title(3)其實是前三個字母
因此以下才是正確的處理方式 - 更改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);