0

我有一个脚本,它查看给定目录并获取所有文件进行处理。问题是我希望它忽略任何隐藏的 (.) 文件。我在thisthis等其他帖子中看到了很多方法,但我的情况很简单,我认为值得一问,因为我是 octave 的新手。值得一提的是,第二个链接很简单,但我不得不使用 for 循环来过滤似乎很奇怪......

这是我的代码:

dirname = strcat(pwd, '/fileset');
files = dir(dirname);
fileidx = find(~[files.isdir]);

for i = 1:length(fileidx)
    filename = [dirname, '/', files(fileidx(i)).name];
    fid = fopen(filename, 'r');
end
4

1 回答 1

2

我曾承诺对第一行“多一点爱”……“那行不行”。这里是。

有一些有趣的方法来操作单元数组,直到我对这个答案进行了更多研究,我才知道这些方法......特别是使用cellfun(). 我将分享我学到的东西。

例如,当您有一个文件名元胞数组时

fnames = {files.name};

您可以应用正则表达式来查找符合特定条件的文件(例如“不以点开头”)

crit = '^[^.]+';

% return cell array of results, [] if no match
rxResult = regexp( fnames, crit ); 

% loop over all cells, set true if regex matched
nodot = (cellfun('isempty', rxResult)==0); 

% The `nodot` array is a logical array telling us which are "good" files. 
totalGoodFiles = sum(nodot);

现在你可以使用

fileidx = find(~[files.isdir] & nodot);

另一方面,您已经在使用for循环,因此您可以将测试放在那里(编辑为包括文件数):

fCount=0;
for i = 1:length(fileidx)
if( files(fileidx(i)).name(1) ~= '.')
      filename = [dirname, '/', files(fileidx(i)).name];
      fCount = fCount+ 1;
      fid = fopen(filename, 'r');
    end
end

顺便说一句,您可以使用该功能fullfile()来连接目录和文件名;它了解用于您的操作系统的正确文件分隔符。非常方便 - 比连接 '/' 更好。当您尝试在 Mac 上运行时,它会失败...

更进一步 - 内置常量filesep将返回正确的文件路径分隔符以在您的平台上使用;有利于使您的代码可移植。

于 2013-02-07T05:20:47.297 回答