本ブログではIgorというグラフソフトの使い方について解説しています。私もものすごく高度な使い方をしているわけではありませんが、単にグラフを作成するだけでなく、解析の自動化をするマクロの作成など、データの解析に利用しています。そのノウハウについてブログで紹介しようと思います。
今回はデータのを読み込む際に指定したフォルダ内のデータをまとめて読み込んで処理するマクロについてです。研究データの処理にあたってはたくさんのデータを一気に読み込みたいというニーズもあるはずですので、きっと役に立つはずです。
マクロコード
結論から言えば、下のようなマクロを書けばフォルダ内のファイルを一気に取得できます。
Macro Load_Folder()
String FN
variable i=0
loadwave/Q/G/N=hogehoge
killwaves hogehoge0
Newpath/O Pathname S_path
do
FN= Indexedfile(Pathname,i,".txt")//txtファイル名を取得
if( strlen(FN) == 0 )//実際にはこのプロセスで止まる。
break
endif
LoadWave/N=hogehoge/G/P=Pathname FN
duplicate/O hogehoge0 $FN
killwaves hogehoge0
//ここにその他行いたい動作・解析など
i=i+1
while(1)
EndMacro
以下でそれぞれ説明していきます。
フォルダの場所を取得する
まずはファイルを読み込むフォルダの場所を取得する必要があります。おそらくいくつか方法があると思いますが、私はファイルを選択することでそのファイルが存在するフォルダの名前を取得する方法を使っています。
loadwave/Q/G/N=hogehoge
は通常のファイルを読み込むコマンドです。/Gのオプションを使っているので、general text形式で読み込んでおり、/N=hogehogeと指定しているので、hogehoge0, hogehoge1などと続き番号でデータを取得します。このコマンドはあくまでもフォルダの場所を取得しただけなので、
killwaves hogehoge0
でデータを消しています。読み込みで複数のデータ(hogehoge0, hogehoge1, hogehoge2,,,)が読み込まれる場合にはすべてのデータを消しておきます。
前回のマクロによるデータのインポートの回で扱いましたが、このloadwaveコマンドでは”S_filename”という文字列に自動でファイルの名前が保存されます。それと同時に、実は“S_path”文字列にフォルダの場所を表すパスの名前が保存されています。これを利用してフォルダの場所を指定するのです。
Newpath/O Pathname S_path
S_pathはあくまでも文字列なので、パスを設定します。上でPathnameとしているのがパスの名前です。ややこしいですが、Pathnameというパスの中身をS_pathにしています。
以上で読み込みたいフォルダが指定できたので、いよいよデータを読み込んでいきます。
Indexedfile 関数を使う
次にdo文を使ってフォルダ内のファイルを読み込んでいくのですが、フォルダ内のファイル全部をどう指定するのか困るはずです。 Indexedfile 関数 を使います。
indexedfile(A,B,C)
indexedfile関数はファイルの名前を返す関数です。上記のAにパスの名前、Bに数字、Cに名前を絞り込む条件を入れます。
Bの数字はフォルダ内のファイルに番号を付けたもので、これを0から順番に変えていくと、ファイルの数-1のところでファイルが存在しなくなるので、このことを利用してdo文を作ります。
今回のマクロではFNという名前の文字列に読み込みたいファイルの名前を入れて、
LoadWave/N=hogehoge/G/P=Pathname FN
で読み込んでいます。/Pはパスの名前(フォルダの場所)を指定するオプションで、FNによりファイル名も指定しているので、これでダイアローグを立ち上げることなく(ユーザーからのパラメータの指定がなくても)読み込めます。
このdo文はif文で終了させています。
if( strlen(FN) == 0 )
break
フォルダ内に存在する数(iの値ではその数―1)を超えるとindexedfile関数は空の文字列を返します。ですので、FNの中身が空になったらマクロを止めるというのが上記のif文の意味です。実際のマクロは必ずこの文で止まることになります。
読み込むファイルの種類を指定する
フォルダ内に読み込みたいデータのみしかない場合には指定する必要がないのですが、実際にはメモや参考資料、あるいはIgorのファイルなどが同じフォルダに保存されていることもあるでしょう。indexedfileのCのパラメータで指定することによって、読み込むファイルの種類を絞り込むことができます。
Indexedfile(Pathname,i,".txt"
今回のマクロではデータの種類がテキストファイルであることを仮定して”.text”をCの部分に入れています。これによりフォルダ内の.txtファイルのみがインデックスされます。
名前はファイル名にしておくのが無難
このマクロ内のLoadwave関数での読み込みではhogehoge+続き番号で自動でデータの名前が決まってしまいます。しかし、どのファイルを読み込んだデータなのか明確にするためにもデータの名前に元のファイルの名前を指定したいでしょう。ファイルの名前はFNで取得しているので、簡単に作れます。
duplicate/O hogehoge0 $FN
killwaves hogehoge0
上のコードでは、hogehoge0のデータをファイルの名前のデータにduplicate関数でコピーしています。データをコピーしたら元のhogehoge0は必要ないので削除します。
一つのファイルから複数のデータが読み込まれる場合には”ファイルの名前+_1”、 “ファイルの名前+_2” のような文字列を新たに作り、それぞれコピーすればよいと思います。このあたりは前回と同じですね。
まとめ
今回はマクロでデータを読み込む方法の応用編として、フォルダ内のファイルをまとめて読み込む方法を紹介しました。もっと効率的な方法、うまい方法などあるかと思いますが、私が普段使っている方法について紹介させてもらいました。お役に立てれば嬉しいです。
コメント