【问题标题】:Automatically Create and Name Tables in Matlab from Excel Tabs从 Excel 选项卡在 Matlab 中自动创建和命名表
【发布时间】:2016-03-15 02:17:35
【问题描述】:

我有以下单元格数组,它是 excel 文件中一些(但不是全部)选项卡名称的列表:

选择标签 =

'Screen'
'SectorAbsolute'
'SectorRelative'

如何让它根据此列表中的内容读取 Excel 工作表的每个选项卡并返回选项卡内容表?新表应与读取的选项卡同名。

我已经尝试过(例如创建一个名为“SectorAbsolute”的表 包含选项卡'SectorAbsolute'的内容):

char(chosenTabs(2))=readtable(inputFile,'Sheet',char(chosenTabs(2)))

但这会返回错误:

您不能只使用一个下标来为表格下标。表下标需要行和变量下标。

【问题讨论】:

  • 您正在尝试动态命名变量。你不想这样做。使用数字索引(数组、元胞数组)存储数据或使用结构数组和dynamic field referencing
  • 顺便说一句,您可以使用花括号{} access data in a cell array 并消除调用char 的需要

标签: excel matlab loops matlab-table


【解决方案1】:

所以您可以执行以下操作,但请注意,不建议动态命名变量和使用eval

my_command_string = [chosenTabs{i},'=readtable(inputFile,''Sheet'',chosenTabs{i})'];
eval(my_command_string);

如果我在编码:

我可能只是把它写出来(除非有很多......):

tab_Screen         = readtable(inputFile,'Sheet','Screen');
tab_SectorAbsolute = readtable(inputFile,'Sheet','SectorAbsolute');

如果有吨和吨......

使用结构,excaza 在this answer 中建议的结构看起来很漂亮。其他一些方法是:

方法一:

n_chosenTabs    = length(chosenTabs);
chosenTabs_data = cell(n_chosenTabs, 1);
for i=1:n_chosenTabs
  chosenTabs_data{i} = readtable(inputFile,'Sheet',chosenTabs{i});
end

方法二:

您还可以使用containers.Map 从选项卡名称转到实际表。加载地图:

tab_map = containers.Map;
for i=1:n_chosenTabs
  tab_map(chosenTabs{i}) = readtable(inputFile,'Sheet',chosenTabs{i});
end

然后您可以使用类似的方式访问各个表。

local_copy_of_sector = tab_map('Sector');

请注意,如果您更改 local_copy_of_sector,它不会更改存储在 containers.Map 中的副本;

【讨论】:

  • 当然。我遵循反对动态命名的逻辑。但是,这是解决此问题的最佳方法,并且您的代码可以完美运行。选项卡将被固定,并且只会选择它们的不同组合。然而,他们的名字不会改变。谢谢!
  • @Mary 显然你没有遵循反对动态命名的逻辑,因为那样你就永远不敢使用evalThis post 包含有关为什么 eval 是 MATLAB 中最多的 evil 函数以及为什么要不惜一切代价避免使用它的信息。
  • @MatthewGunn 我认为您应该能够将所有选项卡名称添加到一个单元格数组中,并在加载时循环遍历它,将变量存储在一个数字可访问的单元格数组中,即data{ii} = readtable(inputFile,'Sheet',tabnames{ii}); 并循环遍历ii
  • @MatthewGunn 使用全局变量也不是世界末日,这并不是一个好主意。
  • @Adriaan High BBC 编码风格是使用ij 作为计数变量。我理解使用 ii 代替 Matlab 特定文化的愿望,但很少有人这样做。将1i 用于虚数并将i 用于计数变量是一个很好的解决方案,尤其是如果您的工作不涉及使用虚数。 1i 是一个很好的 sol,因为它永远不可能是一个有效的变量名!
【解决方案2】:

一种利用structure array的方法:

chosentabs = {'Sheet1', 'Sheet3'};
ntabs = length(chosentabs);

for ii = 1:ntabs
    mytables.(chosentabs{ii}) = readtable('test.xlsx', 'Sheet', chosentabs{ii});
end

它返回mytables,一个包含您的表的结构数组。您可以显式访问您的工作表(例如mytables.Sheet1)或使用dynamic field referencing(例如mytables.(somestring)

【讨论】:

    猜你喜欢
    • 2014-02-18
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    相关资源
    最近更新 更多