How to writetable to file with 2nd row containing VariableUnits?

조회 수: 15 (최근 30일)
Miguel Aznar
Miguel Aznar 2017년 11월 13일
댓글: Jan Kappen 2024년 10월 22일
Hi Everyone,
I would like to know how to write a table to file including the metadata (specifically VariableUnits). the function " writetable " does not seem to allow for this function. I have tried to writ table to a comma delimited file and use dlmwrite (....'-append') but this adds the unit row at the bottom of the file and one character at the time instead of the entire string. I would like to have it in the 2nd row, right underneath the variable names.
  댓글 수: 3
Voss
Voss 2024년 10월 22일
이동: Voss 2024년 10월 22일
t = table([1;2;3],[4;5;6]);
t.Properties.VariableNames = {'A','B'};
t.Properties.VariableUnits = {'m','ft'};
filename = 'file.txt';
writetable_with_units_line(t,filename)
type(filename)
A,B m,ft 1,4 2,5 3,6
writetable_with_units_in_brackets(t,filename)
type(filename)
A[m],B[ft] 1,4 2,5 3,6
function writetable_with_units_line(t,filename)
fid = fopen(filename,'w');
str1 = strjoin(t.Properties.VariableNames,',');
str2 = strjoin(t.Properties.VariableUnits,',');
fprintf(fid,'%s\n%s',str1,str2);
fclose(fid);
writetable(t,filename,'WriteMode','append','WriteVariableNames',false,'Delimiter',',');
end
function writetable_with_units_in_brackets(t,filename)
fid = fopen(filename,'w');
str = strjoin(t.Properties.VariableNames+"["+t.Properties.VariableUnits+"]",',');
fprintf(fid,'%s',str);
fclose(fid);
writetable(t,filename,'WriteMode','append','WriteVariableNames',false,'Delimiter',',');
end
Jan Kappen
Jan Kappen 2024년 10월 22일
Thanks for that proposal. Yeah it can be done this way, but I'd prefer not to write my own function for that ;)
BTW, I think you can make it shorter without using fopen and friends...
function writetable_with_units_in_brackets(T, filename)
arguments
T table
filename (1,1) string
end
namesWithUnits = T.Properties.VariableNames + " (" + T.Properties.VariableUnits + ")";
T.Properties.VariableNames = namesWithUnits;
writetable(T, filename, Delimiter=",");
end
But again - no function would be better.
A solution could be an extended version of the table class, adding a property WriteVariableUnits which gets parsed during writetable. But since table can't be subclassed that will never happen :(

댓글을 달려면 로그인하십시오.

채택된 답변

Miguel Aznar
Miguel Aznar 2017년 11월 13일
I found a work around it. It is pretty simple. I hope it helps whoever is stuck trying to do the same. Write first the header with fprinf indicating %s as the formatting of your cell array. Do not forgwt the break in the last cell "\n", and indicate the metadata of your table (i.e. Table.Properties.VariableNames {1,1:end})
fid = fopen('test.csv','w')
fprintf('test.csv', '%s, %s, %s, %s, %s, %s\n', Table.Properties.VariableNames{1,1:end});
fprintf('test.csv', '%s, %s, %s, %s, %s, %s\n', Table.Properties.VariableUnits{1,1:end});
M = table2array(Table);
dlmwrite('test.csv', M, '-append') ;

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Tables에 대해 자세히 알아보기

제품

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by