Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将单元格数组写入csv文件_Arrays_Matlab_Csv_Cell - Fatal编程技术网

Arrays 将单元格数组写入csv文件

Arrays 将单元格数组写入csv文件,arrays,matlab,csv,cell,Arrays,Matlab,Csv,Cell,全部, 我有一个包含5个单元格的单元格数组,如下所示: <18250x1 int32> <18250x1 int32> <18250x1 int32> <18250x1 double> <18250x1 double> 在每个单元格中,有18250行和1列 现在我想把这些数据写入一个csv文件,有18250行,5列 我尝试过Cell2mat,它只允许数组具有相同的数据类型。我需要在输出中维护int或double的数据类型。有人知道如

全部,

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

<18250x1 int32> <18250x1 int32> <18250x1 int32> <18250x1 double> <18250x1 double> 
在每个单元格中,有18250行和1列

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

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


谢谢,James。

这会有点复杂,因为每个单元格都有不同的数据类型。我认为尊重数据类型的唯一方法是手动创建自己的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);
上面的代码通过使用打开一个名为test.csv的文件进行编写。这将返回指向要写入的文件的链接。然后,我们迭代每个单元格数组中的每个对应元素,然后手动将其作为文件中的一行写入。每个数字以逗号分隔,并根据每个数字的数据类型在CSV文件中组成一行。完成后,我们手动放置一个回车并转到下一行,直到完成。然后,我们关闭该文件,表示我们已停止写入该文件,并且可以应用更改


试试看,看是否有效

这将稍微复杂一些,因为每个单元格都有不同的数据类型。我认为尊重数据类型的唯一方法是手动创建自己的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);
上面的代码通过使用打开一个名为test.csv的文件进行编写。这将返回指向要写入的文件的链接。然后,我们迭代每个单元格数组中的每个对应元素,然后手动将其作为文件中的一行写入。每个数字以逗号分隔,并根据每个数字的数据类型在CSV文件中组成一行。完成后,我们手动放置一个回车并转到下一行,直到完成。然后,我们关闭该文件,表示我们已停止写入该文件,并且可以应用更改


试试看,看是否有效

只需创建一个与您的单元阵列相当的单元阵列:

>> 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]
在使用dlmwrite将int32列写入文件之前,可以将其转换为双精度。对于前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

只需创建一个与您的单元阵列相当的单元阵列:

>> 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]
在使用dlmwrite将int32列写入文件之前,可以将其转换为双精度。对于前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

谢谢,Rayryeng,在稍微更改代码后,它可以完美地工作。fid=fopen'test.csv','wt';对于idx=1:18250 val1=M{1}idx;val2=M{2}idx;val3=M{3}idx;val4=M{4}idx;val5=M{5}idx;fprinffid,'%d,%d,%f,%f\n',val1,val2,val3,val4,val5;结束fclosefid@詹姆斯,我修理一只小虫子的时候你可能抓住了我。我在fprintf声明中忘了一件事。如果这有帮助,请考虑接受我的答案!对于那些好奇的人来说,这就是如何指导用户如何将单元格数组打印到文件中。您还可以将所有嵌套单元格收集到一个一级数组newarray=[M{1}:,M{2}:,…,M{n}:对于这个例子,但是如果你无论如何都在循环,我认为你不会得到任何东西。@excaza-谢谢你的链接!谢谢你,Rayryeng,它在稍微更改你的代码后工作得很好。fid=fopen'test.csv','wt';for idx=1:18250 val1=M{1}idx;val2=M{2}idx;val3=M{3}idx;val4=
M{4}idx;val5=M{5}idx;fprinffid,'%d,%d,%f,%f\n',val1,val2,val3,val4,val5;结束fclosefid@詹姆斯,我修理一只小虫子的时候你可能抓住了我。我在fprintf声明中忘了一件事。如果这有帮助,请考虑接受我的答案!对于那些好奇的人来说,这就是如何指导用户如何将单元格数组打印到文件中。您还可以将所有嵌套单元格收集到一个一级数组newarray=[M{1}:,M{2}:,…,M{n}:对于这个例子,但是如果你在循环,我认为你不会得到任何东西。@excaza-谢谢你的链接!很好。我总是忘记dlmwrite。@rayryeng,是的。我只是担心dlmwrite不允许为每个列指定fprintf允许的不同格式,所以我不得不尝试。但最后,Matlab尝试优化压缩格式本身…所以它在这种情况下工作。虽然不是很灵活,但大多数其他编写混合数据类型的问题都需要fprintf,如您所示。很好。我总是忘记dlmwrite。@rayryeng,是的。我只是担心dlmwrite不允许为每一列指定fprintf允许的不同格式,所以我不得不尝试。但最后,Matlab试图自行优化压缩格式…因此它在这种情况下工作。虽然不是很灵活,但大多数其他编写混合数据类型的问题都需要fprintf,如图所示。