読者です 読者をやめる 読者になる 読者になる

複数ファイルを自動的にフォルダ分けしてIgor Proに一括読み込みする

追記 (2016/9/25)

しばらく,動作しないバージョンをGitHubにアップロードしてしまっていました.以前ダウンロードして動かなかった方は,もう一度お試しください.

はじめに

f:id:ryotako:20160822223406g:plain

Igor Proで複数ファイルを同時にロードするプロシージャを作りました.ファイル名を頼りに,いい感じに階層化したデータフォルダを作ってウェーブを読み込みます(言葉では説明しにくいので,上のデモを見てください).

上記のデモでプロシージャウィンドウに何か書いてありますが,このようにして簡単にロードの設定(最初の数行を無視するとか,CSVファイルであるとか)を追加できます.

また,特定の種類のファイルを読み込んだら自動で何かを実行する,といった設定も可能です*1

背景

Igor Proでデータを扱う際は通常,データをIgor内部のデータフォルダに入れて管理します.一度内部にデータを読み込んでしまえば,Igor Proのシンプルな内部スクリプト言語を用いてデータを煮るなり焼くなり好きにできます.

しかしデフォルトのIgor Proでは,ファイルをひとつずつロードする必要があり,データ解析の最初のステップが面倒です.

複数ファイル読み込みができない点に不満を感じるIgor Proユーザーは多いようで,IgorのコミュニティサイトIgorExchangeで最もダウンロードされているプロシージャは,複数ファイルを読み込むためのもの(MultifileLoader)だったりします.

ただ,上記のMultifileLoaderが私のmacで動かなかったのと,追加したい機能があったので代替を作りました.

使い方

こちらからmultiload.ipfをダウンロードしてIgor Proに読み込んでください.

github.com

デフォルトではメニューバーにMultiLoadという項目が追加されるはずです.Standard Settingという項目をクリックすると,拡張子がtxtかdatの標準テキストを複数選択するウィンドウが出ます.ファイルを読み込む際には,ファイル名を_(アンダーバー)と(半角空白)を区切り文字として単語に分解し,共通の単語を持つファイルが同じフォルダに入るようにフォルダを自動生成します.

Standard Settingでは,ファイルは標準テキストファイルであるとして読み込みます.ファイルの冒頭5行はコメントなので無視したい,といった場合の特殊なファイル読み込みには対応していません.その場合は,MultiloadメニューのGeneral Settingをクリックすると,設定を変更して読み込みができます*2

ユーザー定義の設定の追加

multiload.ipf の冒頭に以下のような様式でStandard Settingが定義されています,これをコピペして書き換えることで,好きな設定を追加できます.関数名をMultiload_で始まるものにしておくと,メニューにも自動で項目が追加されます.

// Menu: Standard Setting (*.dat, *.txt)
Function Multiload_Standard_Setting()
    STRUCT Multiload ml // これは呪文なので気にしない.
    ml.command    = "LoadWave/A/D/G/Q %P; KillVariables/Z V_Flag; KillStrings/Z S_waveNames" // ファイルを読み込みに使うコマンド.%Pはパスの意.
    ml.dirhint    = "%B" // フォルダの自動生成のための文字列.そのうち詳しい記事を書く予定.
    ml.filetype   = "Data Files" // ファイルの種類.ファイルを開くためのウィンドウに表示されるだけなので,適当で構わない.
    ml.extensions = ".dat;.txt" // 読み込み対象にするファイルの拡張子.;を区切り文字として複数選択可.
    ml.delimiters = "_; " // ファイル名の中の単語の区切り.sampleA-10K-a_axis.datのようにハイフンで区切る流儀の場合,これを"-"に設定.
    ml.load(ml) // 読み込みの実行そのもの.
End

オプション

私の作ったプロシージャに共通する設定ですが,定数を上書きすることによってメニューバーに表示する文字を変えることができます.

override strconstant MultiLoad_Menu="<<" // デフォルトではMultiloadと表示される

残念ながら⇪のようなユニコード文字はメニューに表示できませんが,数学記号や☆くらいならメニューの名前にできます.

*1:このプロシージャの標準設定(standard setting)では,ファイルを読んだ後にV_FlagとS_waveNamesを削除する,といった処理を自動実行します.ロードしたウェーブの名前と数は現物を見ればわかる,ということで.

*2:ちなみに,ファイルの5行目まで無視するには Commandを"LoadWave/A/D/G/L={0,6,0,0,0} %P"に設定します.%Pは実行時にファイルのパスに展開されます.