好吧,所以我觉得这应该是一个非常简单的问题,但我已经在努力了。这是不好的,因为我下周有一个测试,我几乎不了解我们需要知道的一半。但是,除了这一点之外。我需要做的是编写一个函数,它接收一个Excel文件和一个Header(这将是我们输入的字符串)。然后它在文件中找到Header并对其进行排序(如果列由字符组成,则按字母顺序排序;如果有数字,则按字母顺序排序)。
输入:
测试用例:
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');
此时我大多需要提示。我应该努力在自己身上找出这些东西,但这说起来容易做起来难。注意:标题不会总是在同一个地方,并且可以有任意数量的行或列。
答案 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);