在matlab中合并和操作文件

时间:2010-04-27 21:24:56

标签: matlab loops file-io

有没有办法在一个文件夹中运行一个循环并像30个文件一样处理一个月并给出每个列的平均值,最大值并写入一个excel表单左右?

我有30个文件大小[43200 x 30]
我运行了一个不同的matlab脚本来生成它们,因此名称很简单 File_2010_04_01.xls,File_2010_04_02.xls .....等等 我不能合并它们,因为每个都是20mbs,matlab会崩溃。 有任何想法吗? 感谢

2 个答案:

答案 0 :(得分: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×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

答案 1 :(得分:0)

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

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

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