所有
我有一个包含5个单元格的单元格数组,如下所示:
<18250x1 int32> <18250x1 int32> <18250x1 int32> <18250x1 double> <18250x1 double>
在每个单元格中,有18250行和1列数。
现在我想将这些数据写入一个包含18250行,5列的csv文件。
我尝试过Cell2mat,它只允许数组具有相同的数据类型。我需要在输出中维护int或double的数据类型。有谁知道如何解决这个问题?
谢谢,詹姆斯。
答案 0 :(得分:3)
这会稍微复杂一些,因为每个单元格都有不同的数据类型。我认为尊重数据类型的唯一方法是通过打开要写入的文件手动创建自己的CSV文件,然后一次一行地手动将条目写入CSV文件。请记住,CSV文件以逗号分隔,因此数字用逗号分隔,每行用回车符分隔。
您基本上会遍历特定单元格的每一行,然后通过尊重数据类型并在每个值之间插入逗号并手动为数据的每一行放置回车符来按原样写入数据。假设您的数据存储在名为M
的单元格数组中,您可以执行以下操作:
fid = fopen('test.csv', 'w');
for idx = 1 : 18250
val1 = M{1}(idx);
val2 = M{2}(idx);
val3 = M{3}(idx);
val4 = M{4}(idx);
val5 = M{5}(idx);
fprintf(fid, '%d,%d,%d,%f,%f\n', val1, val2, val3, val4, val5);
end
fclose(fid);
上面的代码使用fopen
打开了一个名为test.csv
的文件。这将返回我们要写入的文件的链接。然后,我们遍历每个单元格数组中的每个对应元素,然后手动将其作为文件中的一行写出。每个数字都以逗号分隔,并通过尊重每个数字的数据类型在CSV文件中组成一行。完成后,我们手动放回车,然后转到下一行,直到我们完成。然后我们关闭文件以表示我们已停止写入文件,我们可以应用更改。
试一试,看看是否有效!
答案 1 :(得分: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将识别它们是整数并相应地调整写入输出。对于最后两列,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