Read files in a folder with dates on them
7 views (last 30 days)
Show older comments
Hi everyone, I have a folder with multiple.mat files that are named : Profile_YYYY_Mon for example Profile_1990_Jan.mat the monts are Jan Feb Mar until Dec .How can i read each file in the correct chronological order and then use it to do something inside a for loop?
0 Comments
Accepted Answer
Stephen23
on 14 Jun 2023
Edited: Stephen23
on 14 Jun 2023
The actual solution is to parse the filenames that you gave. Lets create some fake files with fake data:
X=1;save Profile_1990_Jan.mat X
X=2;save Profile_1990_Feb.mat X
X=3;save Profile_1990_Mar.mat X
X=4;save Profile_1990_Apr.mat X
Now lets read them in chronological order:
P = '.'; % absolute/relative path to folder where files are saved.
S = dir(fullfile(P,'Profile*.mat')); % alphabetical order.
I = regexp({S.name},'\d+_\w+','match','once');
DT = datetime(I,'InputFormat','y_MMM')
[~,X] = sort(DT);
S = S(X); % sort into chronological order
for k = 1:numel(S)
F = fullfile(P,S(k).name);
D = load(F);
D.X % do whatever you want with the imported data
end
Another approach without REGEXP:
S = dir(fullfile(P,'Profile*.mat')); % alphabetical order
DT = datetime({S.name},"InputFormat","'Profile'_y_MMM'.mat'")
[~,X] = sort(DT);
S = S(X); % sort into chronological order.
for k = 1:numel(S)
F = fullfile(P,S(k).name);
D = load(F);
D.X % do whatever you want with the imported data
end
More Answers (2)
Image Analyst
on 14 Jun 2023
Edited: Image Analyst
on 14 Jun 2023
How about something like this to sort by file time/date stamp:
folder = pwd; % Wherever you want.
filePattern = fullfile(folder, 'Profile*.mat');
fileList = dir(filePattern);
[~, sortOrder] = sort([fileList.datenum], 'ascend');
fileList = fileList(sortOrder)
allFileNames = fullfile(folder, {fileList.name});
for k = 1 : numel(allFileNames)
thisFileName = allFileNames{k};
fprintf('Now processing "%s" with a date of %s.\n', thisFileName, fileList(k).date);
% Now do something with the file.
end
Image Analyst
on 14 Jun 2023
Edited: Image Analyst
on 14 Jun 2023
How about something like this to sort by the 3 letter month string:
months = {'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'}
folder = pwd; % Wherever you want.
filePattern = fullfile(folder, 'Profile*.mat');
fileList = dir(filePattern);
[~, sortOrder] = sort([fileList.datenum], 'ascend');
fileList = fileList(sortOrder)
allFileNames = fullfile(folder, {fileList.name})
for k = 1 : numel(months)
indexes = find(contains(allFileNames, months(k)));
for m = 1 : numel(indexes)
thisFileName = allFileNames{indexes(m)};
% See if this filename contains the k'th month.
% If it does, process it. If not, skip it.
fprintf('Now processing "%s" with a date of %s.\n', thisFileName, fileList(indexes(m)).date);
end
end
See Also
Categories
Find more on Large Files and Big Data in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!