如何在循环中以文本格式打印和保存表的结果?

时间:2016-11-20 12:42:26

标签: matlab text-files

result       'output1'   'output2' 
result1      [1.0000]    [0.0182]
counter      [     2]    [     0]
percentage   [     4]    [     7]

我有一个存储在表格中的输出(T),我想在一个文本文件中打印所有200个循环结果。我已经尝试使用可写功能并且总是有问题,输出会覆盖以前的输出。

fid = fopen(filename,'w'); 
for i = 1:200
writetable(T,'finalresult.txt','Delimiter','\t','WriteRowNames',true);
end
fclose(fid);

输出应该是这样的:

result       'output1'   'output2' 
result1      [1.0000]    [0.0182]
counter      [     2]    [     0]
percentage   [     4]    [     7]


result       'output1'   'output2' 
result1      [0.0182]    [1.0000]
counter      [     3]    [     0]
percentage   [     4]    [     7]
所有输出i = 200

等等

2 个答案:

答案 0 :(得分:1)

根据MATLAB的documentation for writetable,这是默认行为。

  
      
  • 如果filename是现有文本文件的名称,则writetable会覆盖该文件。
  •   

这为您提供了两个选项:创建自己的导出例程或使用所需行为重载MATLAB。让我们看看后者。

enter image description here

警告:修改默认的MATLAB行为可能会导致意外的结果和错误。注意只修改MATLAB默认文件的副本,以便在完成后恢复MATLAB的状态。

幸运的是,table及其相关方法的源代码目前已打开,因此您可以使用open来阅读它们并了解它们的行为。我们看到writetable是未记录的table.write的瘦包装器,它解析输入参数并确定是否写入文本文件或电子表格。对于文本案例,MATLAB调用writeTextFile函数(再次,未记录)来处理将表数据写入文本文件。

如果查看line 25,您将看到MATLAB打开文件进行编写,如下所示:

% Open the file for writing
[fid,errmsg] = fopen(file,'Wt'); % text mode: CRLF -> LF

根据fopen的文档,这将打开写入文件('W'),该文件将丢弃任何现有内容。保存writeTextFile的副本并更改fopen调用以附加数据而不是覆盖它应该会产生所需的行为。

% Open the file for writing
fprintf('!!! Using overloaded writeTextFile D:\n%s\n', mfilename('fullpath'));
[fid,errmsg] = fopen(file,'At'); % text mode: CRLF -> LF

根据MATLAB的Function Precedence Order,Private或Object函数优先于MATLAB路径中的函数,因此我们需要将此修改后的文件放在与原始函数相同的位置。您可以使用which -all找到此位置:

>> which writeTextFile -all
C:\excaza\writeTextFile.m
C:\Program Files\MATLAB\R2016b\toolbox\matlab\datatypes\@tabular\writeTextFile.m  % tabular method

您应该看到保存的副本和MATLAB的内置版本。您现在应该重命名内置函数(例如writeTextFile_builtin.m)并将修改后的文件版本复制到该文件夹​​中。运行clear all一次以清除该函数的任何内存缓存版本。

我们现在可以测试一下我们是否达到了预期的结果:

filename = 'test.txt';

var1 = 1;
var2 = 2;

T1 = table(var1, 'RowNames', {'hi'});
T2 = table(var2, 'RowNames', {'hi'});

writetable(T1, filename)
writetable(T2, filename)

返回以下test.txt

Row var1
hi  1
Row var2
hi  2

完成后,请务必还原对内置所做的更改。

答案 1 :(得分:0)

a1=0.1;
a2=0.2;

opt =fopen('test.txt','a');

for i=1: size(t,1)

j=1;
    if(i==1)
       s=strcat('\n','result','\t',t(i,j),'\t',t(i,j+1),'\n'); 
       s=s{1};
    end
    if (i==2)
        a1=t{i,j};
        a2=t{i,j+1};

   s=strcat('\n','result1','\t',num2str(a1),'\t',num2str(a2),'\n'); 
end

 if (i==3)
    a1=t{i,j};
    a2=t{i,j+1};

   s=strcat('\n','counter','\t',num2str(a1),'\t',num2str(a2),'\n'); 
end

    if (i==4)
    a1=t{i,j};
    a2=t{i,j+1};

   s=strcat('\n','counter1','\t',num2str(a1),'\t',num2str(a2),'\n'); 
end
if (i==5)
    a1=t{i,j};
    a2=t{i,j+1};

   s=strcat('\n','percentage','\t',num2str(s1),'\t',num2str(s1),'\n'); 
end



     fprintf(opt,s);
end

输出将是这样的

result      output1     output2 

result1     1.0000       0.0182

counter       1          1

counter1      0          0

percentage    0          0 

我在没有做任何功能修改的情况下解决了它。 @Brian感谢您的回答和明确的解释。