2017-05-13 65 views
1

我已經寫接受字符串(名稱)一個MATLAB函數作爲輸入:創建Excel文檔的一個結構陣列從Excel工作表

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

Excel工作表具有如下的數據:

首先-Name | Last-Name | Subject1 |主題2 | ..(so to to subject n)

對於excel表格中的每一列,在每個主題n中都有特定數量的行(如200)人名和標記。

我需要創建一個結構數組,其中包含上面指定的每列的每個人的數據(帶有字段的1x200結構數組)。另外,主題名稱對於每次更改Excel工作表所以我需要的結構陣列是在這個意義上動態(如Subject1可能是化學,數學Subject2等)

我怎樣才能做到這一點?在結構上的第一個條目的

例子應該是:

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,....) 

以上的循環不起作用,allFName只包含的第一個名字最後一行/ excel文件中的條目。

回答

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

我太過於複雜了。非常感謝你! :) –

相關問題