объединение и манипулирование файлами в Matlab - PullRequest
0 голосов
/ 28 апреля 2010

Есть ли способ запустить цикл по папке и обработать, как 30 файлов, в месяц и дать среднее значение, максимум каждого столбца и записать в один лист Excel или около того ??

У меня есть 30 файлов размером [43200 x 30]
Я запустил другой скрипт Matlab, чтобы сгенерировать их, чтобы имена были простыми Файл_2010_04_01.xls, Файл_2010_04_02.xls ..... и т. Д. Я не могу объединить их, так как каждый по 20 МБ, и Matlab потерпит крах. Есть идеи? Спасибо

Ответы [ 2 ]

2 голосов
/ 28 апреля 2010

Сначала вы можете получить список ваших файлов, используя функцию 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
0 голосов
/ 28 апреля 2010

Вы можете использовать команду dir, чтобы получить список (на самом деле это структурный массив) файлов в данной папке. Это должно позволить вам получить доступ к вашим файлам и выполнять любые необходимые вам действия. Кроме того, поскольку вы сами сгенерировали имя файла, не должно возникнуть проблем с его повторной генерацией.

Если вас беспокоит размер данных, которые вам, возможно, придется прочитать, рассмотрите возможность использования необязательного аргумента fscanf, который может ограничивать размер прочитанных данных. Вы также можете использовать fgetl для чтения и обработки ваших файлов построчно.

Наконец, для таких операций над текстовыми файлами, возможно, найдутся лучшие инструменты, чем Matlab.

...