从Excel工作表创建结构数组

时间:2017-05-13 03:51:59

标签: arrays excel matlab matlab-struct

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

  http://localhost:4200/abc

excel表格包含以下数据:

名字|姓氏| Subject1 |主题2 | ..(以此为主题n)

对于Excel工作表中的每一列,每个主题中都有特定数量的行(比如说200个)名称和标记。

我需要为上面指定的每个列创建一个结构数组,其中包含每个人的数据(带字段的1x200结构数组)。此外,主题名称随每个excel表格而变化所以我需要结构数组在这个意义上是动态的(例如,Subject1可以是Chemistry,Subject2 Math等)

我该怎么做?

结构中的第一个条目示例应为:

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

我目前的尝试如下:

First-Name: {'George'}
Last-Name: {'Henry'}
Chemistry: [55]
Math: [76]
Subject3: ....

上面的for循环不起作用,allFName只包含excel文件中最后一行/条目的名字。

1 个答案:

答案 0 :(得分:3)

您可以通过以两种方式首先处理原始数据,在一次调用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