フィルターのクリア

How to make writetable write sub structures or tables

16 ビュー (過去 30 日間)
Scott Tatum
Scott Tatum 2018 年 11 月 1 日
回答済み: Himanshu 2018 年 11 月 6 日
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

採用された回答

Himanshu
Himanshu 2018 年 11 月 6 日
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

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeStructures についてさらに検索

製品


リリース

R2017b

Community Treasure Hunt

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

Start Hunting!

Translated by