我有一个非常简单的问题,但不知何故我无法在谷歌和matlab的帮助中找到答案。 所以我有2个文件夹,每个文件夹有200个文件,以某种模式命名。第一个文件夹包含文件,每个文件在另一个文件夹中都有相应的文件。 例如一对文件:
Folder1: 2014-02-25_001_140225_111946 FFlC-1-1-100-0,55-114-315-0-3cm rms 2k.png
Folder2: Date=140225_Time=112038 FFlC-1-1-100-0,55-114-315-0-3cm avg 4k.jpg
两个文件的FFlC-1-1...-3cm
部分相同。
所以我用dir
将目录内容读入2个结构,然后我可以将第一个文件名中的公共部分分成一个字符串。
但是如何在其他目录中的文件名中搜索此字符串? 换句话说,如何在结构中搜索srting?
Filenames1=dir('....\photos1\*.png')
Filenames2=dir('....\photos2\*.jpg')
for i=1, length(Filenames1)
string=Filenames1(i).name(30:60)
pic= Filenames_2(find(string)) <-- but this does not work.
end
嗯,实际上它有效,但是它不是1个文件名,而是给我31个(1个正确,30个不正确)。看起来不是使用整个字符串('FFlC-1-1-100-0,55-114-315-0-3cm'),而是使用逗号之前的部分('FFlC-1-1-100-0 “)。
答案 0 :(得分:0)
您正在寻找的功能是strfind(str, pattern)
,在您的情况下,如果我理解它,一个想法是:
%... loop over all elements in *Filenames1*
pattern=Filenames1(ii).name(30:60);
%... start a loop over *Filenames_2*
str=Filenames_2(jj).name;
Matches(ii,jj)=strfind(str, pattern) %don't forget to initialize *Matches*
%...
close loops
现在Matches
具有找到字符串的位置,如果不是,则为空值。
答案 1 :(得分:0)
您可以将文件名从结构中弹出到单元格数组中,然后使用strcmp
,ismember
,regexp
或其他矢量化比较,避免内部循环。诀窍是使用{ s.field }
语法从.name
返回的结构数组中提取dir()
字段。
names2 = { Filenames2.name };
我实际上会先解析第二个目录中的文件名,这样你就可以使用精确的相等比较而不是子串搜索。
Filenames1=dir('....\photos1\*.png')
Filenames2=dir('....\photos2\*.jpg')
% Extract just the names from the second dir listing
names2 = { Filenames2.name };
% parse them: fixed-width records work well as 2-D char arrays
namesTmp = char(names2);
ids2 = cellstr(namesTmp(:, 26:55));
for i=1:numel(Filenames1)
id=Filenames1(i).name(30:60)
% Then use exact comparison
ix = find(strcmp(id, ids2))
matchingFile = names2{ix}
end