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); 

実際のデータのインポートは、ほとんどの場合、指定された範囲の Excel データに対応するマトリックスを返す関数importfile3のラッパーによって実行されます。xlsread

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、セル内のすべてのデータを 1 つの大きな 2 次元マトリックスに連結した結果です。それぞれ 20 行 17 列の 2 つの Excel ファイルをインポートすると、サイズが[20 x 34]の 2 次元マトリックスになります。ドキュメントには、これ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)2 番目の Excel ファイルからインポートされたデータを返します。等

于 2012-09-25T04:27:32.417 に答える