在MATLAB(高级I / O)中按Excel标题排序

时间:2014-10-15 00:39:27

标签: matlab sorting if-statement io data-extraction

好吧,所以我觉得这应该是一个非常简单的问题,但我已经在努力了。这是不好的,因为我下周有一个测试,我几乎不了解我们需要知道的一半。但是,除了这一点之外。我需要做的是编写一个函数,它接收一个Excel文件和一个Header(这将是我们输入的字符串)。然后它在文件中找到Header并对其进行排序(如果列由字符组成,则按字母顺序排序;如果有数字,则按字母顺序排序)。

输入:

Where is show the 44 Con thing, should be a 31

测试用例:

 scores = sortByHeader(x, 'Opponent');
   scores => 'Opponent'              'Tech Points'    'Opponent Points'
            'Clemson'               [         30]    [             27]
            'Clemson'               [         39]    [             34]
            'Duke'                  [         49]    [             10]
            'Florida State'         [         49]    [             44]
            'Georgia'               [         24]    [             30]
            'Iowa'                  [         14]    [             24]
            'Jacksonville State'    [         37]    [             17]
            'Miami'                 [         17]    [             33]
            'Mississippi State'     [         42]    [             31]
            'North Carolina'        [         24]    [              7]
            'Vanderbilt'            [         56]    [             31]
            'Virginia'              [         34]    [              9]
            'Virginia Tech'         [         28]    [             23]
            'Wake Forest'           [         30]    [             27]

我几乎无法弄清楚如何识别问题中的标题。到目前为止我有:

  function[scores] = sortByHeader(File, Name)

    [num, txt, raw] = xlsread(File); %// Reads in the file

%// Gives me the dimensions of the file

    [r,c] = size(raw); 
 %// I want to look through all of the columns until I find the header I need  

    for i = 1:c 
%// I'm attempting to search through the file here

       if strcmp(raw(1, i), Name) 

%// Here's my issue. When it finds the name, I am not sure what to do with it then
           Name_Column = 1; 
       end
%// I tried to mask it, but this doesn't actually work.

    raw(Name_Column) = raw; 

%// How I plan to sort everything once I find it. Though I believe I need to adjust this slightly to solely account for the 'Name' Column.

    scores = sort(raw, 'ascend'); 

此时我大多需要提示。我应该努力在自己身上找出这些东西,但这说起来容易做起来难。注意:标题不会总是在同一个地方,并且可以有任意数量的行或列。

1 个答案:

答案 0 :(得分:1)

方便地,标题将始终位于变量'raw'的第一行中,如上所述。

headerMatch = strcmp(raw, Name);
whichColumn = find(headerMatch(1,:));

这将返回一个逻辑数组headerMatch,其匹配位置为1,字符串为Name,而whichColumn将返回列号,因为我们只查看第一行。

然后就是把你用这些命令识别的列拉出来并对它进行排序,这是你以前挣扎的地方。有几种方法可以解决单元阵列,它看起来似乎不一致,但它归结为你想要的输出。如果您想要一个返回当前数组子节的单元格数组,请使用与用于矩阵寻址的括号。如果您尝试获取要寻址的单元格内的值,请使用花括号。请参阅下面两个排序调用中拉出字符串单元格数组或值的差异。对于字符串的单元格数组和数字向量,sort命令稍有不同,这就是为什么有两种不同的调用具有两种不同的参数格式。只需要先检查你正在处理哪一个,然后传递给相应的排序函数。

if ischar(raw{2, whichColumn}) % ischar checks if the first cell we want to sort has numbers or letters in it

    sortedColumn = sort(raw(2:end, whichColumn)); % Sort a cell array of strings

else 

    sortedColumn = sort(vertcat(raw{2:end, whichColumn}), 'ascend'); % Sort a vector of numbers

end

编辑:要返回按标题名称指定的给定列排序的整个电子表格数据(不带标题),请拉出上面的列索引(whichColumn变量)。然后使用'sortrows'命令按该列对电子表格数据的单元格数组进行排序。

sortedMatrix = sortrows(raw(2:end, :), whichColumn);