Matlab:将输出写入csv文件

时间:2014-07-11 06:19:06

标签: matlab csv

我有一些数据,包括我想将它们存储在csv文件中的字符串和数字。 作为函数输出的数字存储在1x20的数组中。 所以在csv文件中,我希望有21列!因此,csv文件中的第一列应该是字符串,接下来的20列具有1x20数组中的信息。 我怎么能这样做?

我使用这样的东西来制作一个1x21的单元格:

  

%str:string变量; arr:1x20数字数组

     

c = cell(1,21);

     

c {1,1} = str;

     

对于cnt = 2:21

     

c {1,cnt} = arr(1,cnt-1);

     

然后我尝试了下面link提供的代码:

fid = fopen('test.csv', 'w') ;
fprintf(fid, '%s,', c{1,1:end-1}) ;
 fprintf(fid, '%s\n', c{1,end}) ;
 fclose(fid) ;
 dlmwrite('test.csv', c(2:end,:), '-append') ;

,但我无法在csv中看到确切的数据。例如,我有arr(1,1) = 1.0000。但是csv文件中的第二列是空的!

有人可以帮我解决这个问题吗?


更新: 答案没有用:( 让我以不同的方式提出我的问题,并使其有点清楚。 我希望在我的csv文件中有一些类似下面的数据:

path, feat1, feat2, feat3, feat4 C:\mydata\First\,10,2.001,450,12 C:\mydata\Second\,11,4.41,250,11 C:\mydata\Third\,20,3.891,289,10

因此,每行数据在第一列中有一个字符串,在下面有4个数字。 这4个数字是函数作为数组的输出。因此成像str是字符串,output是4个数字的数组。所以,我想在下面的代码中添加一个部分,它可以将结果以我上面提到的格式存储到csv文件中。

path1 = "C:\mydata\First\";
path2 = "C:\mydata\Second\";
path3 = "C:\mydata\Third\";
output = [];

for i = 1:3
    str = eval(sprintf("path%d",i));
    output = myFunction(str); % output is an array of data
    %%The code I need to add here to store the data in a csv file%%
 end

我希望现在很清楚。提前谢谢。

3 个答案:

答案 0 :(得分:2)

正如文件所述:

dlmwrite(filename,M,'-append') appends the data to the end of the existing file, filename.

这不是你想要的:你想要追加到每一行。所以在字符串之后添加所有值。 你可能需要做类似的事情:

for i = 1:20
   fprintf(fid, '%s,');
   dlmwrite('test.csv', c{2:end,:}, '-append');
end
  1. 我不确定是否应该在每个fprintf之后关闭该文件。你应该自己检查一下。
  2. 我不确定涉及单元格的语法。使用它们没有任何好处,因为您从不对整个单元格进行处理。
  3. 考虑使用一个简单的矩阵表示可以正常工作的值:

    dlmwrite('test.csv', c(2:end,:), '-append');
    

    只有在你想要(或结构)时才使用单元格作为String部分。

    编辑:

    好的,这是针对您的问题的经过测试的工作方法:

    fid = fopen('testing.txt', 'w');
    A = rand(4,3);
    for i = 1:size(A,1)
        String = sprintf('Line: %d', i);
        fprintf(fid, sprintf('%s, %1.2f, %1.2f, %1.2f\n', String, A(i,:)));
    end
    fclose(fid);
    

    如果你不想在矩阵A中明确指定元素的数量,那么即使像这样的解决方案也适用于Matlab(因为它为每个元素重复?print命令): / p>

    fid = fopen('testing.txt', 'w');
    A = rand(4,3);
    for i = 1:size(A,1)
        String = sprintf('Line: %d', i);
        fprintf(fid, sprintf('%s,', String));
        fprintf(fid, sprintf('%1.2f,', A(i,:)));
        fprintf(fid, '\n');
    end
    fclose(fid);
    

    我希望这能解决你的问题。

答案 1 :(得分:1)

如果要保存单元格的2:20列,则需要使用常规括号,如下所示:

c(1,cnt)=arr(1,cnt-1);

对于编写具有混合数据类型的csv文件,csvwrite不起作用。请参阅 Thanushan Balakrishnan 评论。

答案 2 :(得分:1)

好的,我找到了解决方案:

path1 = "C:\mydata\First\";
path2 = "C:\mydata\Second\";
path3 = "C:\mydata\Third\";
output = [];
fid = fopen('test.csv', 'w') ;
for i = 1:3
    str = eval(sprintf("path%d",i));
    output = myFunction(str); % output is an array of data
    %%The code I need to add here to store the data in a csv file%%
    fprintf(fid, '\n%s,', str) ;
    for cnt = 1:4
        fprintf(fid, '%d,', output(1,cnt));
    end
 end
fclose(fid) ;