0

特定のディレクトリを見て、処理するすべてのファイルを取得するスクリプトがあります。問題は、隠し (.) ファイルを無視することです。thisthisのような他の投稿でこれを行う方法をいくつか見ましたが、私の場合はとても単純なので、octave を初めて使用するので、質問する価値があると思いました。2番目のリンクは単純ですが、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 に答える