MATLABでファイル名一覧をcell配列で取り出すまでの手順
MATLABでデータを扱う際に非常に便利なcell配列について、備忘録としてまとめておこうと思います。
一例として、カレントディレクトリのファイル名一覧をcell配列として取り出す例を示します。
cell配列とは
まずはMathWorksのウェブサイトの説明から。
cell 配列はセルと呼ばれるインデックス付きのデータ コンテナーをもつデータ型です。各セルには任意のデータ型を含めることができます。
とあります。
実際に、cellセル配列には色々な構造のデータをまとめて入れる事ができます。
次に例を示します。
cell配列の例
cell_array = {'a1', 'a2', 'a3'};
cell_array2 = {2, 123, 10.5};
%stという構造体を事前に定義
st.a = 12;
st.b = 24;
st.c = 36;
cell_array3 = {'a', 23, 152, st};
cell_array3のように、変数の型が異なるもの(文字列、数値、構造体)でも一つの配列に入れられます。
cell配列の読み出し
cell配列全体を読み出した場合
cell_array
%> cell_array =
% 1×3 cell array
% {'a1'} {'a2'} {'a3'}
cell_array2
%> cell_array2 =
% 1×3 cell array
% {[2]} {[123]} {[10.5000]}
cell_array3
%> cell_array3 =
% 1×4 cell array
% {'a'} {[23]} {[152]} {1×1 struct}
型がばらばらでも、cell配列として認識してくれています。
cell配列の要素を読み出した場合
cell_array3{1}
% >ans = 'a'
cell_array3{2}
% >ans = 23
cell_array3{3}
% >ans = 152
cell_array3{4}
% >ans = struct with fields:
% a: 12
% b: 24
% c: 36
cell_array3{4}.a
% >ans = 12
各要素は、インデックス番号で呼び出すことができます。
構造体が含まれる場合は、更にドットの演算子で構造体の中にある要素を取り出すことができます。
ファイル情報を取得する
続いてファイル情報の取得について紹介します。
ファイル情報の取得には、dir関数を使用します。
%カレントディレクトリ内のファイル情報を取得する
files1 = dir('./'); %全てのファイル情報を取得する
files2 = dir('./*.txt'); %特定のファイル情報を取得する
%(例は.txtで終わるファイル情報のみ取得する場合)
dir関数で読み出すと、次のフィールドを持つ構造体(struct)配列を取得できます。
- name
- folder
- date
- bytes
- isdir
- datenum
ファイル情報の取得の具体例
上のディレクトリで試してみましょう。
work_cell.mが実行しているMATLABファイルになります。
実行しているファイル以外の名前をまとめて取得します。
このようにファイル名を始め、情報を取得できました。
ファイル情報をまとめて取り出す
cell配列でファイル名一覧を取得
file_name_cell_array = {files1.name}; % cell配列
> file_name_cell_array = { '.', '..', 'file01.txt', 'file02.txt', 'file03.txt'}
{}で囲う一行で全てのファイル名をcell配列として取得できます。
このように扱えることがcell配列の魅力の一つだと思います。
MATLABの抽象度の高い記述は素晴らしいですね。
string配列でファイル名一覧を取得
file_name_string_array = string(file_names_cell); % string配列に変換
>file_name_string_array = ['.', '..', "file01.txt","file02.txt","file03.txt"]
もちろん、文字配列にも変換可能です。
ファイル名を個別に取得
file_name_ele = files1(3).name; % 3番目のファイル名を取得
>file_name_ele = 'file01.txt'
上で紹介したように、インデックス番号と構造体のフィールド名(今回はname)で要素の取得も可能です。
不要なファイル名を削除する
dirでファイル情報を取得するとカレントディレクトリ '.' や 一つ上の階層のディレクトリ '..' も含まれてしまいます。
不要な場合は、空の行列の代入により削除しましょう。
%'.', '..'を削除する
file_names_cell(:,1:2) = [];
file_names_string_array(:,1:2) = [];
以上になります。
最後にこれまでに紹介したコードを載せておきます。
%%
%% cell配列の例
%%
cell_array = {'a1', 'a2', 'a3'};
cell_array2 = {2, 123, 10.5};
%stという構造体を事前に定義
st.a = 12;
st.b = 24;
st.c = 36;
cell_array3 = {'a', 23, 152, st};
%%
%% cell配列全体を読み出した場合
%%
cell_array
%> cell_array =
% 1×3 cell array
% {'a1'} {'a2'} {'a3'}
cell_array2
%> cell_array2 =
% 1×3 cell array
% {[2]} {[123]} {[10.5000]}
cell_array3
%> cell_array3 =
% 1×4 cell array
% {'a'} {[23]} {[152]} {1×1 struct}
%%
%% cell配列の要素を読み出した場合
%%
cell_array3{1}
% >ans = 'a'
cell_array3{2}
% >ans = 23
cell_array3{3}
% >ans = 152
cell_array3{4}
% >ans = struct with fields:
% a: 12
% b: 24
% c: 36
cell_array3{4}.a
% >ans = 12
%%
%% ファイル情報を取得する
%%
%カレントディレクトリ内のファイル情報を取得する
files1 = dir('./'); %全てのファイル情報を取得する
files2 = dir('./*.txt'); %特定のファイル情報を取得する
%(例は.txtで終わるファイル情報のみ取得する場合)
%%
%% cell配列でファイル名一覧を取得
%%
file_name_cell_array = {files1.name}; % cell配列
> file_name_cell_array = { '.', '..', 'file01.txt', 'file02.txt', 'file03.txt'}
%%
%% string配列でファイル名一覧を取得
%%
file_name_string_array = string(file_names_cell); % string配列に変換
>file_name_string_array = ['.', '..', "file01.txt","file02.txt","file03.txt"]
%%
%% ファイル名を個別に取得
%%
file_name_ele = files1(3).name; % 3番目のファイル名を取得
>file_name_ele = 'file01.txt'
%%
%% 不要なファイル名を削除する
%%
%'.', '..'を削除する
file_names_cell(:,1:2) = [];
file_names_string_array(:,1:2) = [];
便利な使い方があれば、今後も追加していこうと思います。