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


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

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


    我的微博我的github我的B站

    • 作为一名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
    ',title(1),title(2),title(3));
    % 参数3有误
    
    • 为此将其元组转换为矩阵试试
    % 注意fprintf不支持元胞数组
    title={'NO','obj1','obj2'};%这样写会报错
    % fprintf(fid,'%s,%s,%s
    ',title(1),title(2),title(3));
    fprintf(fid,'%s,%s,%s
    ',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
    ',title(1),title(2),title(3)); % 这样写会保错
    fprintf(fid,'%s,%s,%s
    ',cell2mat(title(1)),cell2mat(title(2)),cell2mat(title(3)));
    % 一共有51行
    for i=1:size(data,1)
    	fprintf(fid,'%d,%d,%d
    ',BD1(i),data(i,1),data(i,2));
    end
    fclose(fid);
    

    在这里插入图片描述

    fprintf字符串矩阵

    • 对于注意fprintf不支持元胞数组,还有一种思路,就是使用字符串矩阵表示表头
    • 刚开始我是下面这样写的
    title=['NO','obj1','obj2'];
    fprintf(fid,'%s,%s,%s
    ',title(1),title(2),title(3));
    

    在这里插入图片描述

    • 可以看到这种方式把title当做整个字符串,而title(1),title(2),title(3)其实是前三个字母
      在这里插入图片描述
      因此以下才是正确的处理方式
    • 更改fprint中的索引
      title=['NO','obj1','obj2']; fprintf(fid,'%s,%s,%s ',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
    ',title(1:2),title(3:6),title(7:10));
    % 一共有51行
    for i=1:size(data,1)
    	fprintf(fid,'%d,%d,%d
    ',BD1(i),data(i,1),data(i,2));
    end
    fclose(fid);
    
  • 相关阅读:
    【codevs1079】回家
    【codevs1245】最小的N个和
    【codevs1231】最优布线问题
    【codevs1078】最小生成树
    【NOIP1999】【codevs1083】Cantor表
    【NOIP2006】【codevs1075】明明的随机数
    【NOIP2001】【codevs1011】数的计算
    【POJ2259】Team Queue(队列,模拟)
    【LOJ119】单源最短路 模板
    Jzoj4900 平方数
  • 原文地址:https://www.cnblogs.com/cloud-ken/p/12701082.html
Copyright © 2020-2023  润新知