从 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
我编写了一个 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