将元胞数组写入 csv 文件

Posted

技术标签:

【中文标题】将元胞数组写入 csv 文件【英文标题】:Write cell array to csv file 【发布时间】:2014-11-25 17:11:41 【问题描述】:

所有,

我有一个包含 5 个单元格的单元格数组,如下所示:

<18250x1 int32> <18250x1 int32> <18250x1 int32> <18250x1 double> <18250x1 double> 

在每个单元格中,有 18250 行和 1 列的数字。

现在我想将这些数据写入一个 csv 文件,有 18250 行,5 列。

我尝试过 Cell2mat,它只允许数组具有相同的数据类型。我需要在输出中维护 int 或 double 的数据类型。有人知道如何解决这个问题吗?

谢谢,詹姆斯。

【问题讨论】:

【参考方案1】:

这会有点复杂,因为每个单元格都有不同的数据类型。我认为尊重数据类型的唯一方法是通过打开一个文件进行写入手动创建您自己的 CSV 文件,然后手动将您的条目一次写入 CSV 文件中。请记住,CSV 文件是逗号分隔的,所以数字之间用逗号分隔,每一行之间用回车符分隔。

您基本上会遍历特定单元格的每一行,然后通过尊重数据类型并在每个值之间放置逗号并为每行数据手动放置回车符来按原样写入数据。假设您的数据存储在一个名为 M 的元胞数组中,您可以执行以下操作:

fid = fopen('test.csv', 'w');
for idx = 1 : 18250
    val1 = M1(idx);
    val2 = M2(idx);
    val3 = M3(idx);
    val4 = M4(idx);
    val5 = M5(idx);
    fprintf(fid, '%d,%d,%d,%f,%f\n', val1, val2, val3, val4, val5);
end
fclose(fid);

上面的代码使用fopen打开了一个名为test.csv的写入文件。这将返回一个指向我们要写入的文件的链接。然后,我们遍历每个元胞数组中的每个对应元素,然后手动将其写成文件中的一行。每个数字都以逗号分隔,并通过尊重每个数字的数据类型构成 CSV 文件中的一行。完成后,我们手动放置回车并转到下一行,直到完成。然后我们关闭文件以表示我们已停止写入文件,我们可以应用更改。

试试看是否可行!

【讨论】:

谢谢,Rayryeng,稍微修改一下代码后它就可以正常工作了。 fid = fopen('test.csv', 'wt');对于 idx = 1 : 18250 val1 = M1(idx); val2 = M2(idx); val3 = M3(idx); val4 = M4(idx); val5 = M5(idx); fprintf(fid,'%d,%d,%d,%f,%f\n', val1, val2, val3, val4, val5);结束 fclose(fid); @James 当我修复了一个小错误时,你可能发现了我。我在fprintf 声明中忘记了一件事。如果这确实有帮助,请考虑接受我的回答! 对于那些好奇的人,这就是documentation for fprintf 指导用户如何将元胞数组打印到文件的方式。您还可以将所有嵌套单元格收集到一个单级数组中(在此示例中为newarray = [M1(:), M2(:), ... , Mn(:)),但如果您无论如何都要循环,我认为您不会有任何收获。 @excaza - 感谢您的链接!【参考方案2】:

只需创建一个与您的类似的元胞数组:

>> A =  int32(randi(100,100,1)) , int32(randi(100,100,1)) , int32(randi(100,100,1)) , rand(100,1)*100 , rand(100,1)*100 
A = 
    [100x1 int32]    [100x1 int32]    [100x1 int32]    [100x1 double]    [100x1 double]

您可以将int32 列转换为双倍,然后再将它们写入dlmwrite 的文件。对于前 3 列,Matlab 将识别出它们是整数,并相应地调整写入输出。对于最后 2 列,Matlab 将以您指定的精度写入双精度数:

B = [double(cell2mat(A(:,1:3))) , cell2mat(A(:,4:5)) ] ;
dlmwrite('testwrite.csv', B , 'precision',10)

在我的例子中这个输出:

26,100,1,87.70487234,93.37256595
40,23,85,35.31418129,81.09500322
8,66,93,44.94435566,48.45482718
69,61,78,96.35302868,75.67492101
... and so on

【讨论】:

不错。我总是忘记dlmwrite @rayryeng,是的。我只是害怕dlmwrite 不允许为每一列指定不同的格式(正如fprintf 允许的那样),所以我不得不尝试一下。但最后,Matlab 尝试自行优化(压缩)格式......所以它在这种情况下工作。虽然不是很灵活,但编写混合数据类型的大多数其他问题都需要fprintf,如您所示。

以上是关于将元胞数组写入 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

将元胞数组值提取为 java 数据类型

matlab中如何寻找字符串在元胞数组中的位置?

matlab中的元胞数组如何实现批量的赋值呢?

MATLAB的cell数组

MATLAB中,我要把元胞数组中的字符串提取出来,应该用啥函数?

如何在 MATLAB 中连接元胞数组中的字符串,它们之间有空格?