重新排列矢量Matlab中的所有字符串

Rearrange all strings in vector Matlab

我有一个大单元向量,其中包含目录中的文件名,使用

listing = dir(['foldername','\*.xlsx'])

这些文件的名称中有日期,但格式很难确定顺序。例如,每个文件都称为 dataDDMMYYY.xlsx,其中 DDMMYYY 是表示数据日期的数字。

我想获得一个位置向量,将文件从最新到最旧排序。一个建议是使用 arrayfun 从字符串中删除 "data" 和 "xlsx",并使用类似 new=[old(9:12), old(7:6), old(5:6)] 的方法重新排列为 YYYYMMDD。 但是我还没有找到没有错误的这些组合。 有没有一种优雅的方法可以实现这一目标?

您可以使用函数 datenum,它根据指定的格式(在您的例子中是 ddmmyyyy)为每个日期输出一个数字(较小 = 旧,较大 = 较新)。然后您可以使用这些数字对日期进行排序。此方法假定所有文件都是 .xls.xlsx,并且它们的名称在实际日期之前以 data 开头:

listing = dir(['fildername','\*.xls*']); % list all xls and xlsx files in directory
names = {listing.name}; % cell array with names only

[~,dates,~] = cellfun(@fileparts, names, 'uni', 0); % apply fileparts to every cell
dates = cell2mat(dates'); % convert to char matrix (all the string have to be equally long)
dates = dates(:,5:end); % remove 'data' from each string

new_dates = datenum(dates, 'ddmmyyyy'); % extract date number
[sorted_new_dates, index] = sort(new_dates, 'descend'); % sort from newest to oldest

然后您可以使用index从最新到最旧的顺序处理您的原始文件。

listing(index).name % print sorted filenames :)