我有一个包含10000个文件的目录。我想选择那些不包含字符串" _B"的文件进行处理。还有其他带有字符B的文件,我不想排除。
我尝试执行以下操作:
for k=1:n
if(~contains(files(k).name, '*_B*.png'))
...
end
但是这只是用" _B"选择所有文件。代替。如果我删除"包含"前面的波形符号,则没有选择任何文件。我该如何更改线路以获得所需的结果?
答案 0 :(得分:3)
模式语句中的通配符可能是导致问题的原因; contains
不需要它们。正如函数的名称所暗示的那样,如果字符串'包含'模式字符串,则它将返回true,不管其周围是什么。
所以
对于contains(files(k).name, '_B')
或_B.png
或123_B.png
randomfilename_Bahaha.whatever
将返回true
因此,您需要对现有代码进行的唯一更改是从模式字符串中删除通配符,然后离开'_B'
答案 1 :(得分:1)
正如@Adriaan所提到的那样是他的评论,你可以使用比较字符串的strcmp。在你的情况下,你想做类似的事情:
for k=1:n
if strcmp(files(k).name,'_B') %compare your filename with '_B', strcmp returns 1 if it finds the string '_B' in it, 0 otherwise
%process _B files
end
end
答案 2 :(得分:1)
您可以通过应用单元格函数来避免for循环。首先列出文件。在这里,我列出所有以'.png'结尾的文件。然后看看哪些包含字符串'_B',然后选择没有它的文件名。
DIR=dir('*.png');
fName={DIR(:).name}';
searchResult=cellfun(@findstr,fName,repmat({'_B'},length(fName),1),'UniformOutput',false);
chosen=fName(cellfun(@isempty,searchResult));