0

我想导入一系列包含大量数据的 excel 文件。我遇到的问题是我想一次处理每个文件中的数据并将其输出存储到一个变量中,但是每次我尝试处理不同的文件时,变量都会在变量工作区中被覆盖。无论如何我可以存储这些文件并一次处理每个文件吗?

numFiles = 1; 
range = 'A2:Q21'; 
sheet = 1; 
myData = cell(1,numFiles); % Importing data from Excel 
for fileNum = 1:numFiles 
  fileName = sprintf('myfile%02d.xlsx',fileNum); 
  myData{fileNum} = importfile3(fileName,sheet,range); 
end 
data = cell2mat(myData); 

实际的数据导入是由importfile3它执行的,在大多数情况下,它是函数的包装器,该xlsread函数返回与指定范围的 excel 数据相对应的矩阵。

function data = importfile3(workbookFile, sheetName, range)
% If no sheet is specified, read first sheet
if nargin == 1 || isempty(sheetName)
    sheetName = 1;
end

% If no range is specified, read all data
if nargin <= 2 || isempty(range)
    range = '';
end

%% Import the data 
[~, ~, raw] = xlsread(workbookFile, sheetName, range);

%% Replace non-numeric cells with 0.0
R = cellfun(@(x) ~isnumeric(x) || isnan(x),raw); % Find non-numeric cells
raw(R) = {0.0}; % Replace non-numeric cells

%% Create output variable 
data = cell2mat(raw);
4

1 回答 1

0

您遇到的问题是cell2mat将单元格中的所有数据连接到一个大型二维矩阵中的结果。如果您要导入两个 20 行和 17 列的 excel 文件,每个文件都会生成一个大小为[20 x 34]的二维矩阵。的文档cell2mat一个很好的视觉描述。

我看到您的importfile3函数返回一个矩阵,并且根据您cell2mat在最后一行代码中的使用,您似乎希望最终结果采用矩阵的形式。所以我认为最简单的方法就是绕过中间myData单元阵列。

在下面的示例代码中,结果data是一个 3 维矩阵。第 1 维表示行号,第 2 维是列号,第 3 维是文件号。元胞数组对于“锯齿状”数据非常有用,但根据您提供的代码,您导入的每个 Excel 数据集将具有相同的行数和列数。

numFiles = 2; 
range = 'A2:Q21'; 
sheet = 1; 

% Number of rows and cols known before data import
numRows = 20;
numCols = 17;

data = zeros(numRows,numCols,numFiles);
for fileNum = 1:numFiles 
   fileName = sprintf('myfile%02d.xlsx',fileNum); 
   data(:,:,fileNum) = importfile3(fileName,sheet,range);
end 

现在访问这些数据非常简单。

data(:,:,1)返回从您的第一个 excel 文件导入的数据。 data(:,:,2)返回从您的第二个 excel 文件导入的数据。等等

于 2012-09-25T04:27:32.417 回答