【问题标题】:Converting Matlab .mat to csv and keeping variable names将 Matlab .mat 转换为 csv 并保留变量名
【发布时间】:2013-01-03 10:46:13
【问题描述】:

我正在尝试将 .mat 文件转换为 csv,同时保留向量/变量名称。 这是我正在处理的一个例子:

mymat =

       model_id: [2217x1 double]
    own_dummies: [2217x26 double]
             id: [2217x1 double]
        product: [2217x1 double]
          const: [2217x1 double]
            mpd: [2217x1 double]
            air: [2217x1 double]
            mpg: [2217x1 double]
          trend: [2217x1 double]
          space: [2217x1 double]
           hpwt: [2217x1 double]
        cdindex: [20x1 double]
           cdid: [2217x1 double]
         outshr: [2217x1 double]
         firmid: [2217x1 double]
          share: [2217x1 double]
          price: [2217x1 double]

我尝试过使用csvwrite('test.csv', mymat),但它给了我一个错误:

??? Undefined function or method 'real' for input arguments of type 'struct'.
Error in ==> dlmwrite at 192
                str = sprintf('%.*g%+.*gi',precn,real(m(i,j)),precn,imag(m(i,j)));\
Error in ==> csvwrite at 32
dlmwrite(filename, m, ',', r, c);

我想问题是我给 csvwrite 提供了一个结构而不是矩阵。 我可以将 struct 变量转换为变量到矩阵,但是我会丢失变量名。

肯定有更好的方法吗?

【问题讨论】:

  • 那么你会在哪里保存变量名呢?您希望它们存储在第一列吗?
  • 嗨,在这里。是的,第一列或第一行就可以了

标签: matlab csv


【解决方案1】:

您实际上如何将结构映射到 csv?您不能将字段名的直接映射作为第一行的条目,因为矩阵具有不兼容的维度。所以这个例子你必须 1. 为 own_dummies 引入几列 2. 扩展 cdindex。

因此,您可以编写一个包装器来使矩阵本身兼容,并将列自己写入文件中。沿着(未经测试的,概念的)路线的东西

    function saveData(filename, data, type)

    % at first bring struct data to sensible format
    if strcmp(type)='my_mat_type'
        data.own_dummies2 = data.own_dummies[2,:]; % split into seperate columns
        %...
        data.own_dummies26 = data.own_dummies[26,:];
        data.own_dummies = data.own_dummies[1,:];
        data.cdindex = [data.cdindex -ones(1,2217-length(data.cdindex)]; % pad any missing values as -1
    end;


    FD = fopen(filename, 'w');

    %todo did it open?

    fields = fieldnames(data);
    nfields = length(fields);

    % create column name values
    columns = strcat(strcat(fields,',')); % creates string = col1,col2,...coln,
    columns = columns(1:length(columns)-1); %remove trailing comma

    CRNL = char([10 13]); % or so

    % print columns and newline
    fprintf(FD,strcat(columns,CRNL)); 

    dataout = cell2mat(struct2cell(data));

    % use your method to write the data to the file

    fclose(FD);

当然,您也可以将各个字段拆分为单独的文件,其中字段名包含在文件名中,一般来说,这可能更简单。

【讨论】:

  • 非常感谢您的回答!看起来它应该可以解决问题。我会尝试一下并在这里发表评论。
猜你喜欢
  • 2012-10-02
  • 1970-01-01
  • 2019-09-21
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
相关资源
最近更新 更多