通过比较文件名的最后一位数字将特定单元格从单元格数组中拉出

Pull specific cells out of a cell array by comparing the last digit of their filename

我有一个文件名单元格数组 - 诸如“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 循环放在一起;我绝对相信我已经把这个问题过度复杂化了。

我们可以大大整理您的代码。

拿一些例子数据:

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'}