writetable/readtable with multi-line headers

조회 수: 33 (최근 30일)
ET
ET 2025년 1월 14일
댓글: Walter Roberson 2025년 1월 14일
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?

채택된 답변

Voss
Voss 2025년 1월 14일
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 = 3x3 table
Color Weight Temp _______ ______ ____ "Blue" 50 0.1 "Red" 100 0.5 "Green" 75 0.9
T.Properties
ans =
TableProperties with properties: Description: 'Playdough Properties Chart' UserData: [] DimensionNames: {'Row' 'Variables'} VariableNames: {'Color' 'Weight' 'Temp'} VariableTypes: ["string" "double" "double"] VariableDescriptions: {'Outside Color' 'Gross Weight' 'Melting Point'} VariableUnits: {'[-]' '[kg]' '[°C]'} VariableContinuity: [] RowNames: {} CustomProperties: No custom properties are set. Use addprop and rmprop to modify CustomProperties.
% 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)
Playdough Properties Chart Color,Weight,Temp Outside Color,Gross Weight,Melting Point [-],[kg],[°C] Blue,50,0.1 Red,100,0.5 Green,75,0.9
% 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 = 3x3 table
Color Weight Temp _______ ______ ____ "Blue" 50 0.1 "Red" 100 0.5 "Green" 75 0.9
Tnew.Properties
ans =
TableProperties with properties: Description: 'Playdough Properties Chart' UserData: [] DimensionNames: {'Row' 'Variables'} VariableNames: {'Color' 'Weight' 'Temp'} VariableTypes: ["string" "double" "double"] VariableDescriptions: {'Outside Color' 'Gross Weight' 'Melting Point'} VariableUnits: {'[-]' '[kg]' '[°C]'} VariableContinuity: [] RowNames: {} CustomProperties: No custom properties are set. Use addprop and rmprop to modify CustomProperties.
% the table read from file is equivalent to the original table
isequal(Tnew,T)
ans = logical
1
  댓글 수: 2
ET
ET 2025년 1월 14일
Thank you for this answer, and this does indeed work for .csv case, though I'm not sure of how to use fprintf to also print to an excel sheet. I guess I was hoping there was a way to tell writetable to write the variableunits and variabledescriptions in the same way that readtable allows you to read them.
Walter Roberson
Walter Roberson 2025년 1월 14일
There is not support in writetable() for writing the units or variable descriptions.

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

추가 답변 (1개)

Walter Roberson
Walter Roberson 2025년 1월 14일
writetable() first just the header lines. Then writetable() the data with WriteMode='append'
When you readtable() you can specify VariableNamesRange, VariableUnitsRange, VariableDescriptionsRange
  댓글 수: 2
ET
ET 2025년 1월 14일
How do you write just the header lines with writetable?
Walter Roberson
Walter Roberson 2025년 1월 14일
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 CenterFile Exchange에서 Spreadsheets에 대해 자세히 알아보기

제품


릴리스

R2024a

Community Treasure Hunt

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

Start Hunting!

Translated by