MATLAB将存储在双数组和单元阵列中的数据导出为CSV文件

时间:2015-12-07 04:41:11

标签: excel matlab csv

我有一个包含19个字段的MATLAB结构。主要字段是1 x 108033双,所有值都是数字。它看起来像这样,基本上是108033号码:

pnum: 5384940 5437561 5570271 5661637 5771155   ...

我有另一个名为inventors的字段,它是一个1 x 108033的单元格值。每个单元格包含不同数量的字符串。例如,第1列到第5列是

inventors:  {2x1 cell}    {4x1 cell}    {1x1 cell}    {1x1 cell}    {1x1 cell}

对于第一列值,2 x 1单元格由以下值组成 5012491-012035147-03等等。

我想将这两个联合导出到CSV文件中。理想的结果会重复pnum中的数字,以便在pnuminventors之间建立明确的联系。因此,理想的结果看起来像这样(显示inventors单元格中的内容)。

pnum    inventors
5384940 5012491-01
5384940 2035147-03
5437561 5437561-01
5437561 5437561-02
5437561 5437561-03
5437561 5012491-02
5570271 5437561-03
5661637 1885634-08
5771155 5012491-01

我问过这个问题的更复杂版本before,但问题不明确。希望现在是。

1 个答案:

答案 0 :(得分:1)

我假设inventors中的每个单元格都是字符串的单元格数组。将这些作为实际的浮点数或整数数字是没有意义的,因为破折号会减去将它们分开的两个数字。现在,因为您正在写入CSV文件,我能想到的最简单的事情是遍历每个数字和单元格,然后重复ID号码,与单元格中的元素一样多次。首先创建正确的标题,然后编写结果。想到这样的事情:

f = fopen('data.csv', 'w'); %// Open up data for writing
fprintf(f, 'pnum,inventors\n'); %// Write headers
for ii = 1 : numel(pnum) %// For each unique number
    inventor = inventors{ii};
    for jj = 1 : numel(inventor) %// For each inventor ID
        fprintf(f, '%d,%s\n', pnum(ii), inventor{jj}); %// Write the right combo to file
    end
end
fclose(f); %// Close the file

fopen这里打开了一个名为data.csv的文件,以便我们可以编写内容。返回的是一个名为f的文件指针,我们用它来写东西给这个文件。之后,我们编写文件的标题,包含pnuminventors。这是一个CSV文件,因此将逗号分隔开来。现在,对于每个唯一编号,我们然后访问inventors中的右侧插槽,然后为每个唯一的发明人添加相同的唯一ID,并将正确的发明人ID作为该文件中的一行。我使用fprintf使用之前建立的相关文件指针将文件写入文件。完成后,请使用fclose关闭文件。

要仔细检查这是否有效,我已经使用了您在帖子中提供的小例子:

pnum = [5384940 5437561 5570271 5661637 5771155];

inventors = {{'5012491-01', '2035147-03'}.', {'5437561-01', '5437561-02', '5437561-03', '5012491-02'}.', {'5437561-03'}, {'1885634-08'}, {'5012491-01'}};

请记住,我无法访问您的struct,因此您必须访问正确的字段并将其分配给上面显示的相应变量。因此,如果您的struct被称为data,那么您在运行上述代码之前就会这样做:

pnum = data.pnum;
inventors = data.inventors;

运行上面的代码我刚刚编写并打开了CSV文件(名为data.csv),我明白了:

pnum,inventors
5384940,5012491-01
5384940,2035147-03
5437561,5437561-01
5437561,5437561-02
5437561,5437561-03
5437561,5012491-02
5570271,5437561-03
5661637,1885634-08
5771155,5012491-01