通过比较文件名的最后一位数字将特定单元格从单元格数组中拉出
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'}
我有一个文件名单元格数组 - 诸如“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'}