writetable/readtable with multi-line headers
46 ビュー (過去 30 日間)
古いコメントを表示
How can I use writetable to make a table to excel sheet and .csv file which has multi-line headers. Headers can include both per-variable headers like units and description, but also per-table headers like description or comments.
For example, take a table like below.
T = table(["Blue";"Red";"Green"],[50;100;75],[0.1;0.5;0.9],...
VariableNames={'Color','Weight','Temp'});
T.Properties.VariableUnits = ["[-]";"[kg]";"°C"];
T.Properties.VariableDescriptions = ["Outside Color";"Gross Weight";"Melting Point"];
T.Properties.Description = "Playdough Properties Chart";
Now I want to make it look like this in excel and .csv files
I know to do this by other means, but I would like to be able to do it with writetable, and also to read it back in with readtable.
Is there a straight-forward way of doing this?
0 件のコメント
採用された回答
Voss
2025 年 1 月 14 日 17:29
Here's one way:
% specify the file to write to
output_file = 'test.csv';
% construct the table
T = table(["Blue";"Red";"Green"],[50;100;75],[0.1;0.5;0.9],...
VariableNames={'Color','Weight','Temp'});
T.Properties.VariableUnits = ["[-]";"[kg]";"[°C]"]; % added [] around °C
T.Properties.VariableDescriptions = ["Outside Color";"Gross Weight";"Melting Point"];
T.Properties.Description = "Playdough Properties Chart";
T
T.Properties
% write the table to the output file
fid = fopen(output_file,'w');
fprintf(fid,'%s\n', ...
T.Properties.Description, ...
strjoin(T.Properties.VariableNames,','), ...
strjoin(T.Properties.VariableDescriptions,","), ...
strjoin(T.Properties.VariableUnits,","));
fclose(fid);
writetable(T,output_file,'WriteMode','append','WriteVariableNames',false);
% check the contents of the output file
type(output_file)
% read the output file
opts = detectImportOptions(output_file);
opts.VariableNamesLine = 2;
opts.VariableDescriptionsLine = 3;
opts.VariableUnitsLine = 4;
opts.DataLines = [5 Inf];
opts = setvartype(opts,1,'string');
Tnew = readtable(output_file,opts);
tmp = readlines(output_file);
Tnew.Properties.Description = tmp(1);
Tnew.Properties.VariableDescriptions = string(Tnew.Properties.VariableDescriptions);
Tnew.Properties.VariableUnits = string(Tnew.Properties.VariableUnits);
Tnew
Tnew.Properties
% the table read from file is equivalent to the original table
isequal(Tnew,T)
2 件のコメント
Walter Roberson
2025 年 1 月 14 日 19:13
There is not support in writetable() for writing the units or variable descriptions.
その他の回答 (1 件)
Walter Roberson
2025 年 1 月 14 日 17:11
writetable() first just the header lines. Then writetable() the data with WriteMode='append'
When you readtable() you can specify VariableNamesRange, VariableUnitsRange, VariableDescriptionsRange
2 件のコメント
Walter Roberson
2025 年 1 月 14 日 19:05
Actually, writematrix() or writecell() would be easiest for the headers. Construct either an array of string() objects or a cell array of character vectors and writematrix() or writecell() as appropriate.
参考
カテゴリ
Help Center および File Exchange で Spreadsheets についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!