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

Igor Proで「それ全部テキストファイルで頂戴」に備える

Igor Pro

はじめに

データ解析・グラフ作成用ソフトのIgor Pro,これ非常に便利なんですけれども,いかんせん有料ソフトなのでデータを受け渡しする際に相手がIgorを持っていないということがままあります.

そういった場合はウェーブをテキストファイルとして保存する必要があるのですが,データを一つずつ保存するのは難儀なのでプロシージャにしました.

github.com

使い方

例によって,上記のサイトから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関数を使って,エクスペリメント中のdataXdataYという名前のウェーブを一気に保存した例です*3

便利!

f:id:ryotako:20161010145410p:plain

ignoreオプション

あるデータフォルダ以下全て保存してくれるのは便利ですが,データ解析の過程で作成したウェーブ等,無視して欲しいデータフォルダもあるかもしれません.そのような場合はTxtSave_Recursiveignoreオプションで無視するフォルダを指定します.

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/PTxtSave関数を使う上で絶対に必要な部分なので,ユーザーが変更できるのは/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"

おわりに

ウェーブを全てテキストファイルとして保存する,なんて,絶対に誰かがすでに方法を作っているはずで,車輪の再開発な気がしないでもないです.ただ,無視するフォルダの設定なんかは,あまり例がないんじゃないかなと思います.

*1:保存先に同名のファイルが存在した場合,デフォルトでは上書きされます.

*2:Recursive(再帰的な)の名前の通り,TxtSave関数を子フォルダに繰り返し適用するような挙動となります.

*3:データブラウザで表示してはいませんが,データフォルダfolder1にもウェーブdataXとdataYがいます.指定したウェーブが存在しないフォルダは,単に無視されます.

*4:この「後に書いた条件が前の条件を上書きする」という挙動は,gitというバージョン管理ソフトで特定ファイルを無視するときの設定(.gitignore)を参考にしています.

*5:/Mは改行文字を指定するオプションで,Windowsの場合/M="\r\n"をデフォルトで使用します