从 Excel Sheet 创建结构数组

Creating a Struct Array From Excel Sheet

我编写了一个 matlab 函数,它接受 excel 文档的字符串(名称)作为输入:

function printOut = modData(inputExcel)
[num,txt,raw]=xlsread(inputExcel)

excelsheet有以下数据:

名字 |姓 |主题 1 |主题 2 | ..(以主题 n 为例)

对于 excel sheet 中的每一列,每个主题 n 中都有特定行数(例如 200 行)的人名及其分数。

我需要为上面指定的每一列创建一个结构数组,其中包含每个人的数据(带字段的 1x200 结构数组)。此外 主题名称随每个 excel sheet 而变化,所以我需要结构数组在这个意义上是动态的(例如 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文件中最后一个row/entry的First Name。

您可以在对 struct 的一次调用中完成此操作(无需循环),方法是首先以两种方式处理您的原始数据:

  • 替换列名称中的无效字符,因为结构字段名称必须遵循相同的 naming conventions as variables。在这种情况下,'-'可以替换为'_'
  • 将列名后的所有行收集到另一个元胞数组中。这将允许您轻松地将所有数据作为 comma separated list.
  • 传递给 struct

这是一些示例原始数据(从 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}

现在您可以像这样轻松创建结构数组:

>> 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