如何提取 excel 列并将其导入 MATLAB?
How to extract excel column and import it to MATLAB?
您好,我有一个 excel 文件,最多包含 "CD" 个列。我的代码非常适合包含 26 列的 excel 文件,但在那之后它就不起作用了。
[ia ib] = ismember(header, {item});
letter = find(ia)+'A'-1;
cell = fprintf('%c:%c', letter, letter);
out = xlsread('filename', cell);
此代码在我到达 Z:Z 之前有效。当我到达 AA、AB、AC 时,... 它不起作用。如何提取 AA、CD、BG 列?
它不起作用,因为您假设 header 的字母只有一个字符,如以下所示:
letter = find(ia) + 'A' - 1;
您所做的实际上是为 A
到 Z
之间的大写字母构建 ASCII 码。如果您试图找到包含多个字母的 header,这显然会失败。你需要做的是建立一个包含 AA
到 ZZ
的所有可能字符的字典,然后如果我们超过 [=] 列,你可以在这个字典上使用 find(ia)
的输出14=] 在你的 Excel sheet 中提取出你需要的正确字符序列,然后最后使用这个字符序列索引到你的 Excel sheet.
参考this question, I'm going to take Rody Oldenhuis的回答。因此,构建所有可能的两个字符的字典:
x = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
y = unique(nchoosek(repmat(x, 1,26), 2), 'rows');
y
将是一个 N x 2
字符矩阵,其中每一行都是来自 A-Z
的两个字母的唯一排列(因此 AA
、AB
、 ETC。)。按照代码的编写方式,它应该保持准确的顺序,就像 Excel 对超出 Z
的列所做的那样,所以 AA, AB, AC, ... AZ, BA, BB, BC, ... BZ, ..., ZX, ZY, ZZ
。接下来,我们需要查看找到的索引是否在 1 到 26 之间。如果是,您可以使用您之前的代码。如果不是,那么我们将执行上面概述的操作。请注意,我必须将这个找到的索引减去 26,这样我才能索引到我们创建的这个字符数组中。假设 header
具有所有唯一条目,我们可以这样做:
[ia ib] = ismember(header, {item});
index = find(ia, 1);
if index <= 26 %// Check if we are within columns A - Z
letter = index + 'A' - 1;
else %// If not, we are at a column that is beyond Z.
x = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
y = unique(nchoosek(repmat(x, 1,26), 2), 'rows');
index = index - 26; %// Subtract by 26 to reference into character array
letter = y(index,:);
end
cell = sprintf('%s:%s', letter, letter);
out = xlsread('filename', cell);
请注意,我将您的 fprintf
调用更改为 sprintf
,因为您希望存储要访问的单元格的字符串表示形式。 fprintf
(在您的情况下)将打印到屏幕上,这可能不是您想要的。此外,我已将变量 cell
更改为 ce
,因为 cell
是 MATLAB 中的实际函数。
另请注意,我已将 %c
格式字符串更改为 %s
,因为 header 可能包含多个字符。
您好,我有一个 excel 文件,最多包含 "CD" 个列。我的代码非常适合包含 26 列的 excel 文件,但在那之后它就不起作用了。
[ia ib] = ismember(header, {item});
letter = find(ia)+'A'-1;
cell = fprintf('%c:%c', letter, letter);
out = xlsread('filename', cell);
此代码在我到达 Z:Z 之前有效。当我到达 AA、AB、AC 时,... 它不起作用。如何提取 AA、CD、BG 列?
它不起作用,因为您假设 header 的字母只有一个字符,如以下所示:
letter = find(ia) + 'A' - 1;
您所做的实际上是为 A
到 Z
之间的大写字母构建 ASCII 码。如果您试图找到包含多个字母的 header,这显然会失败。你需要做的是建立一个包含 AA
到 ZZ
的所有可能字符的字典,然后如果我们超过 [=] 列,你可以在这个字典上使用 find(ia)
的输出14=] 在你的 Excel sheet 中提取出你需要的正确字符序列,然后最后使用这个字符序列索引到你的 Excel sheet.
参考this question, I'm going to take Rody Oldenhuis的回答。因此,构建所有可能的两个字符的字典:
x = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
y = unique(nchoosek(repmat(x, 1,26), 2), 'rows');
y
将是一个 N x 2
字符矩阵,其中每一行都是来自 A-Z
的两个字母的唯一排列(因此 AA
、AB
、 ETC。)。按照代码的编写方式,它应该保持准确的顺序,就像 Excel 对超出 Z
的列所做的那样,所以 AA, AB, AC, ... AZ, BA, BB, BC, ... BZ, ..., ZX, ZY, ZZ
。接下来,我们需要查看找到的索引是否在 1 到 26 之间。如果是,您可以使用您之前的代码。如果不是,那么我们将执行上面概述的操作。请注意,我必须将这个找到的索引减去 26,这样我才能索引到我们创建的这个字符数组中。假设 header
具有所有唯一条目,我们可以这样做:
[ia ib] = ismember(header, {item});
index = find(ia, 1);
if index <= 26 %// Check if we are within columns A - Z
letter = index + 'A' - 1;
else %// If not, we are at a column that is beyond Z.
x = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
y = unique(nchoosek(repmat(x, 1,26), 2), 'rows');
index = index - 26; %// Subtract by 26 to reference into character array
letter = y(index,:);
end
cell = sprintf('%s:%s', letter, letter);
out = xlsread('filename', cell);
请注意,我将您的 fprintf
调用更改为 sprintf
,因为您希望存储要访问的单元格的字符串表示形式。 fprintf
(在您的情况下)将打印到屏幕上,这可能不是您想要的。此外,我已将变量 cell
更改为 ce
,因为 cell
是 MATLAB 中的实际函数。
另请注意,我已将 %c
格式字符串更改为 %s
,因为 header 可能包含多个字符。