通过比较文件名

时间:2017-09-12 09:25:27

标签: matlab cell-array

我有一个文件名的单元格数组 - 例如'20160303_144045_4.dat','20160303_144045_5.dat',我需要在'.dat'之前的最后一位数字分隔成单独的数组; '... 4.dat的一个单元格数组,'... 5.dat的等等之一

我的代码如下;它使用正则表达式来分割'.dat'周围的文件,重新整形一点然后再次正则表达式以提取文件名的最后一个数字,构建一个单元格来存储文件名,然后我得到了一点点卡住。我有一个产生的数组,如'1,0,1,0,1,0 ..'所需的细胞索引,我认为这可能是微不足道的,但我正在努力让它做我想要的。

numFiles = length(sampleFile); %sampleFile is the input cell array

splitFiles = regexp(sampleFile,'.dat','split');
column = vertcat(splitFiles{:});
column = column(:,1);

splitNums = regexp(column,'_','split');
splitNums = splitNums(:,1);
column = vertcat(splitNums{:});
column = column(:,3);

column = cellfun(@str2double,column); %produces column array of values - 3,4,3,4,3,4, etc

uniqueVals = unique(column);
numChannels = length(uniqueVals);


fileNameCell = cell(ceil(numFiles/numChannels),numChannels);

for i = 1:numChannels

   column(column ~= uniqueVals(i)) = 0;
   column = column / uniqueVals(i); %e.g. 1,0,1,0,1,0

   %fileNameCell(i) 
end

我觉得应该有一种比我的代码更容易的方法,如果我可以避免它,我不想把大量凌乱的for循环放在一起;我绝对相信我已经大规模地过度复杂化了这个问题。

1 个答案:

答案 0 :(得分:1)

我们可以把你的代码搞砸了。

采取一些示例数据:

files = {'abc4.dat';'abc5.dat';'def4.dat';'ghi4.dat';'abc6.dat';'def5.dat';'nonum.dat'};

您可以使用regexp获取最终数字,并匹配一个或多个数字后跟“.dat”,然后使用strrep删除“.dat”。

filenums = cellfun(@(r) strrep(regexp(r, '\d+.dat', 'match', 'once'), '.dat', ''), ...
                   files, 'uniformoutput', false);

现在我们可以将它们放在一个结构中,使用唯一的数字(前缀为字母,因为字段不能以数字开头)作为字段名称。

% Get unique file numbers and set up the output struct
ufilenums = unique(filenums);
filestruct = struct;
% Loop over file numbers
for ii = 1:numel(ufilenums)
    % Get files which have this number
    idx = cellfun(@(r) strcmp(r, ufilenums{ii}), filenums);
    % Assign the identified files to their struct field
    filestruct.(['x' ufilenums{ii}]) = files(idx);
end

现在你有一个整洁的输出

% Files with numbers before .dat given a field in the output struct
filestruct.x4 = {'abc4.dat' 'def4.dat' 'ghi4.dat'}
filestruct.x5 = {'abc5.dat' 'def5.dat'}
filestruct.x6 = {'abc6.dat'}
% Files without numbers before .dat also captured
filestruct.x =  {'nonum.dat'}