Igor Proで「それ全部テキストファイルで頂戴」に備える
はじめに
データ解析・グラフ作成用ソフトのIgor Pro,これ非常に便利なんですけれども,いかんせん有料ソフトなのでデータを受け渡しする際に相手がIgorを持っていないということがままあります.
そういった場合はウェーブをテキストファイルとして保存する必要があるのですが,データを一つずつ保存するのは難儀なのでプロシージャにしました.
使い方
例によって,上記のサイトからtxtsave.ipfをダウンロードしてIgor Proに読み込んでください.
そうすると以下の2つの関数が使用可能になります
- TxtSave(
データフォルダ名
,ウェーブ名
,ファイル名
[option]) - TxtSave_Recursive(
起点のデータフォルダ名
,ウェーブ名
,ファイル名
[ignore,option])
ひとつずつ説明します.
TxtSave
これはほぼ,Igor Proの操作関数Save
と同じ働きをします.
関数の引数にデータフォルダ名
,ウェーブ名
,ファイル名
を指定すると,指定したデータフォルダ中にあるウェーブを,指定した名前のファイルとして保存します.
この関数と組み込みのSave
操作関数の一番の違いは,ファイルの保存先のディレクトリが自動的に決定されることです.
たとえば,test.pxpというIgorのファイルで作業していた場合は,test.pxpと同じディレクトリにtest_txtfiles
というフォルダが作成され,Igor Pro内部のデータフォルダ構造と同じディレクトリ構造を保ったままウェーブが保存されます*1.
TxtSave("root:folder1:sub1:","dataX;dataY","data.txt") // test.pxpと同じ階層に,test_txtfilesディレクトリが作成され,その中に`test_txtfiles/root/folder1/sub1/data.txt`が作成される. TxtSave("","dataX;dataY","data.txt") // 第一引数を""にした場合,現在のデータフォルダのウェーブを保存する.
TxtSave_Recursive
TxtSave
ではウェーブのデータフォルダを指定して保存します.それに対してTxtSave_Recursive
では,起点となるデータフォルダを指定すると,そのデータフォルダ以下に存在する指定した名前のウェーブを一括で保存します*2.
以下の画像が,TxtSave_Recursive
関数を使って,エクスペリメント中のdataX
,dataY
という名前のウェーブを一気に保存した例です*3.
便利!
ignoreオプション
あるデータフォルダ以下全て保存してくれるのは便利ですが,データ解析の過程で作成したウェーブ等,無視して欲しいデータフォルダもあるかもしれません.そのような場合はTxtSave_Recursive
のignore
オプションで無視するフォルダを指定します.
ignore
オプションでは*
によるワイルドカードと!
による否定が使えます.また;
を区切り文字として複数条件を指定することもできます.複数条件を指定した場合は,後に指定した条件が優先されます*4.
TxtSave_Recursive("root:","dataX;dataY","data.txt",ignore="root:Packages") // root:Packages フォルダ以下を無視する TxtSave_Recursive("root:","dataX;dataY","data.txt",ignore="root:Packages;*folder*") // root:Packagesおよび,名前にfolderを含むフォルダ以下を無視する TxtSave_Recursive("root:","dataX;dataY","data.txt",ignore="*folder*;!folder1") // 名前にfolderを含むフォルダ以下を無視するが,folder1は無視しない.(後ろの条件が優先)
optionオプション
TxtSave
関数は内部でSave
操作関数を呼び出していますが,このときのオプションを明示的に指定することもできます.デフォルトでは,内部で
Save/G/O/W/M="\n"/B/P=[自動決定されたパス] [ウェーブ名] as [ファイル名]
としています*5.最後の/B/P
はTxtSave
関数を使う上で絶対に必要な部分なので,ユーザーが変更できるのは/G/O/W/M="\n"
の部分になります.
たとえば,空白区切りではなくタブ区切りの形式でデータを保存したい場合,以下のようにします.
TxtSave_Recursive("root:","dataX;dataY","data.txt",option="/J/O/W/M=\"\\n\"")
メニュー
txtsave.ipfを読み込むと,メニューバーにTxtSave
という項目ができ,そこから関数を呼び出したり,保存したファイルが存在するディレクトリを開いたりできます.
また,TxtSave_
で始まる関数を定義すると,このメニューから呼び出せるようになります.なので,TxtSave_Recursive
を使った関数を用意したら,TxtSave_
で始まる名前にしておくと便利です.
このメニューが邪魔な場合,ファイルを読み込む際に#include "txtsave"
の代わりに#include "txtsave", menus=0
とするとメニューが消えます.
また,メインプロシージャウィンドウに以下のように書くとメニューが「ウェーブを保存」メニュー以下に表示されるようになります.
override strconstant TxtSave_Menu="Save Waves;-;(TxtSave" // あるいは単に,以下のように書いてもよい // override strconstant TxtSave_Menu="Save Waves"
おわりに
ウェーブを全てテキストファイルとして保存する,なんて,絶対に誰かがすでに方法を作っているはずで,車輪の再開発な気がしないでもないです.ただ,無視するフォルダの設定なんかは,あまり例がないんじゃないかなと思います.