2010-04-27 195 views
0

有没有办法通过一个文件夹运行一个循环,并像一个月的30个文件一样处理一个月,并给出每个列的平均值,最大值并写入一张Excel表格?在matlab中合并和处理文件

我有大小30个文件[43200×30]
我跑了不同的MATLAB凭证生成它们这样的名字很容易 File_2010_04_01.xls,File_2010_04_02.xls .....等等 我不能合并它们,每个都是20mbs,matlab会崩溃。 任何想法? 谢谢

回答

2

您可以使用功能DIR首先获取文件列表。这里有一个例子:

dirData = dir('File_2010_04_*.xls'); %# Match file names with a wildcard 
dataFiles = {dirData.name};   %# Get the file names in a cell array 

一旦你有了这些文件,你可以在循环使用XLSREAD它们加载数据。注意:XLSREAD可以返回Excel文件的不同版本的数据:

[numData,txtData,rawData] = xlsread(fileName); %# Where fileName is a string 

这里,numData包含在文件中的数字数据的单元格,txtData包含在文件中的文本数据的单元格,并rawData是细胞包含文件中所有数据的数组。您将必须确定要使用哪个数据阵列以及如何对其进行索引以获取要处理的43200 x 30矩阵数据。

把这个在一起,下面是你怎么可以处理你的数据让您所有的文件的列最大值和列平均一个代码示例:

columnTotal = zeroes(1,30);    %# Initialize column sum 
columnMax = -inf(1,30);     %# Initialize column maxima 
dirData = dir('File_2010_04_*.xls'); %# Match file names in the current folder 
dataFiles = {dirData.name};    %# Get the file names in a cell array 
nFiles = numel(dataFiles);    %# Number of files 
for iFile = 1:nFiles     %# Loop over the files 
    numData = xlsread(dataFiles{iFile}); %# Load the data 
    %# Here, I'm assuming "numData" contains your 43200-by-30 matrix 
    columnTotal = columnTotal+sum(numData);  %# Add up column data 
    columnMax = max(columnMax,max(numData)); %# Get the column maxima 
end 
columnAverage = columnTotal./(nFiles*43200); %# Average across all files 
+0

你能解释一下如何循环的xlsread?你的意思是我为i = 1做了一些事情:....什么是文件名? – Paul 2010-04-28 15:27:49

+0

@Paul:我更新了代码以修复一些错别字。变量'fileName'只是一个包含要加载的文件名称的字符串。上面的示例代码显示了如何循环存储在单元格数组中的一组文件名。在循环中,循环变量'iFile'用于从单元格数组'dataFiles'中获取文件名,然后加载并处理该文件。 – gnovice 2010-04-28 15:43:51

+0

oopss写得太快了,我想出了max val5 = max(numdata(:,5) 给了我 – Paul 2010-04-28 21:38:52

0

您可以使用dir命令获取给定文件夹中文件的列表(实际上是一个结构数组)。这应该允许您访问您的文件并执行您需要执行的任何操作。另外,由于您自己生成了文件名,因此重新生成它们应该没有问题。

如果您担心可能需要读取的数据的大小,请考虑使用可以限制读取数据大小的可选参数fscanf。您也可以使用fgetl逐行读取和处理您的文件。

最后,对于文本文件的这些操作,可能会有比Matlab更好的工具。