我有一个文件名的单元格数组 - 例如'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循环放在一起;我绝对相信我已经大规模地过度复杂化了这个问题。
答案 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'}