从Excel工作表创build一个结构数组
我写了一个matlab函数,它接受一个excel文档的string(名称)作为input:
function printOut = modData(inputExcel) [num,txt,raw]=xlsread(inputExcel)
Excel表格有以下数据:
名字| Last-Name | 主题1 | 主题2 | ..(所以主题n)
对于Excel表格中的每一列,在每个主题n中都有特定数量的行(例如200)人名和标记。
我需要创build一个结构数组,其中包含上面指定的每列的每个人(1×200结构数组与字段)的数据。 另外主题名称随着每个excel表单而改变,所以我需要struct数组在这个意义上是dynamic的(例如Subject1可以是Chemistry,Subject2 Math等)
我怎样才能做到这一点?
首先进入结构的例子应该是:
First-Name: {'George'} Last-Name: {'Henry'} Chemistry: [55] Math: [76] Subject3: ....
我目前的尝试如下:
[RawRow,RawCol]=size(raw); for kk=2:RawRow studentFName = raw(kk,1); allFName = [studentFName]; allFName = [allFName;studentFName]; end DataStruct = struct(raw{1,1},allFirstNames,raw{1,2},allLastNames,raw{1,3},Subject1,....)
上面的for循环不起作用,allFName只包含excel文件中最后一行/ entry的名字。
你可以通过一次调用struct
来实现这一点(不需要循环),首先通过两种方式处理你的原始数据:
- replace列名中的无效字符,因为结构字段名称必须遵循与variables相同的命名约定 。 在这种情况下,
'-'
可以replace为'_'
。 - 将列名后的所有行收集到另一个单元格数组中。 这将允许您轻松地将所有数据以逗号分隔列表的forms传递给
struct
。
这里有一些示例原始数据(从xlsread
加载xlsread
)和一行代码执行上述两个步骤:
>> raw = {'First-Name' 'Last-Name' 'Chemistry' 'Math' 'Killing'; ... 'George' 'Henry' 55 76 0; 'Krombopulos' 'Michael' 90 90 100} raw = 3×5 cell array 'First-Name' 'Last-Name' 'Chemistry' 'Math' 'Killing' 'George' 'Henry' [ 55] [ 76] [ 0] 'Krombopulos' 'Michael' [ 90] [ 90] [ 100] >> cellData = [strrep(raw(1, :), '-', '_'); num2cell(raw(2:end, :), 1)] cellData = 2×5 cell array 'First_Name' 'Last_Name' 'Chemistry' 'Math' 'Killing' {2×1 cell} {2×1 cell} {2×1 cell} {2×1 cell} {2×1 cell}
现在你可以像这样轻松地创build你的结构数组:
>> DataStruct = struct(cellData{:}); >> DataStruct(1) ans = struct with fields: First_Name: 'George' Last_Name: 'Henry' Chemistry: 55 Math: 76 Killing: 0 >> DataStruct(2) ans = struct with fields: First_Name: 'Krombopulos' Last_Name: 'Michael' Chemistry: 90 Math: 90 Killing: 100