複数ファイルを逐次処理する

似た種類のファイルがたくさんあって、それらをひとつずつ読み込んで処理したい、ということがときどきあります。たとえば、複数のWAVファイルすべてをノーマライズしたいとか、たくさんあるテキストファイルの1行目だけを読み込んで別ファイルに書き出したいとか。

そんなとき、僕は以下のようにやっています。あるディレクトリ中のWAVファイルの音圧を半分にして、filename_half.wavという別名で保存するプログラムです。

% 特定の拡張子のファイルのみをリストにする
files = dir('*.wav');

for n=1:length(files)
  % ファイル名を部品に分割
  [path, name, ext] = fileparts(files(n).name);

  % ファイル名を表示
  disp(name);

  % n番目のWAVファイルを読み込む
  [x,fs,nbits] = wavread(files(n).name);

  % 音圧を半分にする
  y = x / 2;

  % WAVファイルを書き出す
  wavwrite(y, fs, nbits, [name '_half.wav']);
end

知ってしまえば単純ですが、こういった処理は利用機会が多いものです。今ではファイル名の一括変更なども(PerlRubyを使えばいいのですが、いつも起動してあるので)Matlabでやってしまいます。