Borrar filtros
Borrar filtros

How to make writetable write sub structures or tables

16 visualizaciones (últimos 30 días)
Scott Tatum
Scott Tatum el 1 de Nov. de 2018
Respondida: Himanshu el 6 de Nov. de 2018
With the following code:
bob = struct()
bob.joe = 1
bob.sam = '4'
bob.bill = [6:10]
bob.jim = struct('a',1,'b','q')
writetable(struct2table(bob))
I get the following output
joe,sam,bill_1,bill_2,bill_3,bill_4,bill_5,jim
1,4,6,7,8,9,10,
So the structure entry for 'jim' is just blank.
If I turn jim into a table
bob.jim = struct2table(bob.jim)
writetable(struct2table(bob))
The output now has the _1 and _2 for jim, but they are blank
joe,sam,bill_1,bill_2,bill_3,bill_4,bill_5,jim_1,jim_2
1,4,6,7,8,9,10,,
So how do I get writetable to deal with this? Preferably I would want the header to come out
joe,sam,bill_1,bill_2,bill_3,bill_4,bill_5,jim.a,jim.b
1 ,4 ,6 ,7 , 8 ,9 ,10 ,1 ,q
Also, if I am not writing to a spreadsheet, I would liek the ability to not expand arrays, so it would look like
joe,sam, bill, jim.a,jim.b
1 ,4 ,[6,7,8,9,10] ,1 ,q

Respuesta aceptada

Himanshu
Himanshu el 6 de Nov. de 2018
Hello Scott
As of MATLAB R2018b, "writetable" is not supported for nested tables. However, you can achieve something similar using the following workaround:
1. Create a file transformStruct.m with following contents
% Function to transform column with structure entries.
% It takes in a structure array and return two column
% arrays, one for each field of the structure
function [a b] = transformStruct(stArr)
a=[];
b={};
for i=1:length(stArr)
a(i) = stArr(i).a;
b{i} = stArr(i).b;
end
a=a';
b=b';
end
2. A file transformArr.m with following contents
% Function to transform column with array entries.
% It takes in a double array and returns a cell array of strings
function out = transformArr(arr)
out = {};
for i=1:size(arr,1)
out{i} = mat2str(arr(i,:));
end
out=out';
end
3. Finally a file main_script.m with contents
% create structure data with 3 rows
bob = struct();
bob.joe = [1; 2; 3];
bob.sam = ['4'; '5'; '6'];
bob.bill = [[6:10]; [11:15]; [16:20]];
bob.jim = [struct('a',1,'b','q'); struct('a',2,'b','r'); struct('a',3,'b','s')];
% create table from structure data
joe = bob.joe;
sam = bob.sam;
% transform the column bill to a cell array, so it
% does not split into separate columns
bill = transformArr(bob.bill);
% transform the column jim into two separate columns, one
% for each field
[jim_a jim_b] = transformStruct(bob.jim);
T = table(joe, sam, bill, jim_a, jim_b);
% write table to file
writetable(T)
Place all three files in a directory, and run the file main_script.m

Más respuestas (0)

Categorías

Más información sobre Structures en Help Center y File Exchange.

Productos


Versión

R2017b

Community Treasure Hunt

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

Start Hunting!

Translated by