IGORでテキストデータを自動ロードする方法の備忘録

 IGORという表計算ソフトを使っている研究室は多いだろうが、割と日本語でのヘルプが少なく、関数を組むのに四苦八苦していないだろうか。
 私頑張って英語のヘルプを読み解いた挙句割とヘルプに書いてない仕様にブチ切れながらなんとかかんとか自動ロードのとこまでできたので、墓標的な何かとしてここに記しておきます。

関数の説明

・waveload


【文法】 waveload  (Flag) path
Flagは /A /O /G /Bを立てるのが便利である。
/A はダイアログを省略してロードする
/Oは上書き
/Gはgeneral textとしてロード
/Bはwaveの名前などプロパティを入力できる。
/B="N='_skip_';N=wave0;"
のように、/Bの中身を""で囲う他、スキップしたい場合、'_skip_'という表記を使えばよい。各カラムの情報はセミコロンで区切る。
pathは指定しなければダイアログが開く。
さらにS_pathに親ディレクトリの「文字列」と、S_filenameにファイル名の「文字列」が格納されているので、これを用いてパス取得も可能。
ややこしいが、このパスが書かれたものは文字列という属性を持つことを忘れずに。

・indexedfile


【文法】 indexedfile(dir,num,ext)
ファイル名を取得できる。
dirは対象の親ディレクトリを「パス形式で」入力する、numはソートした時の番号を、extは拡張子(または検索ワード)を入力する。
numに対応するファイルがない場合、""を返す。

コード例

loadwave /A /O /G /B="N='_skip_';N='_skip_';"
newpath target , S_path
// loadwave で生成されたS_pathという文字列を、targetというパスへ渡す

make /O /N=100 /T list
wave /T flist = list
// list をflistという変数に突っ込む。flistはウェーブで、テキスト形式だということが定義された。

variable i = -1
    do
    i = i + 1
    flist[i] = indexedfile(target, i, .asc)
// flistというテキストウェーブに、.asc形式のファイルの名前を取り込んでいく。
    While ((cmpstr(flist[i], "") != 0)
// cmpstrでflist[i]と""を比較し、i番目の名前が""になる(=ファイルが全部読み込めた)まで処理する。cmpstrは一致の時に0を返すので、値が0でない限りdoからループを繰り返す。

string loading
variable j = 0
    do
    loading = S_path + flist[j]
// S_pathとファイル名を結合して、フルパスを作っている。
    loadwave /A /O /G /B="N="wavelength";"N=dummywave";" loading
// indexedfileではパス属性を持たないと読み込めなかったが、loadwaveはstring属性で書かれたパスを読む。面倒な仕様である。
    rename dummywave , $S_filename
// dummywave をS_filenameに格納された文字列に名前を変更する。loadwaveで直接S_filenameを指定することはできなかった。(まぁ…関数の実行に応じて取得される変数なので…)
    j = j + 1
     While ((cmpstr(flist[i], "") != 0)

deletepoints j, inf, list
// listウェーブの空欄を消す処理です。 j番目(空欄)から無限大(inf)までのポイントを消しています。

End

以上サンプルコードである。詰まったところをできるだけ詳しく書いたので、ぜひ測定データの自動ロードに挑戦してみてほしい。
ちなみに、取り扱ったデータは、紫外可視吸光のものであるので、1つ目のウェーブはwavelenmgthで上書きし続けた(全部同じデータなので。)Xウェーブの中身がデータごとに異なる場合は、

    loadwave /A /O /G /B="N="dummywaveX";"N=dummywaveY";" loading
    String Xwave = S_filename + "X"
    String Ywave = S_filename + "Y"
    rename dummywaveX , $Xwave
    rename dummywaveY , $Ywave

のように工夫するといいだろう。igor上での動作確認はしていないので、うまく動かなかったらごめん。


いいなと思ったら応援しよう!