実践的 Igor メモ 2019

多数のテキスト形式ファイルの読み込み

データファイルの数が10を超え始めるようになると、 ファイル指定、読み込みの操作が苦痛になってくる人が稀にいるようである。 こうした場合にはマクロを使った手法が考えられる。 学生実験で忍耐の美徳を体得する上で、こうした手法に安易に頼るのは好ましくないが、興味のある人は挑戦してみてもよい。 ここでは CHEMUSB4 の OceanView (あるいは SpectraSuite)のタブ区切りのスペクトルデータを読み込む前提で話を進める。

スペクトルデータのファイルが j ドライブの bk というディレクトリにあるとする。 Igorのメニューから「Windows」-「Procedure Windows」-「Procedure Window」でマクロの編集画面を開く。 ここに次のように入力する(//以降はコメントで読み飛ばされる)

Macro MacBK()  // ← マクロの名前は「MacBK」
	LoadWave /G /B="N='wavelength'; N='ah00';" "j:\\bk\\ahxx.txt"
	LoadWave /G /B="N='_skip_'; N='ah01';" "j:\\bk\\ahxy.txt"
	LoadWave /G /B="N='_skip_'; N='ah02';" "j:\\bk\\ahyy.txt"
	LoadWave /G /B="N='_skip_'; N='ah03';" "j:\\bk\\ahyx.txt"
End

プログラムを記述する上で ¥(環境によっては\。元来は円記号ではなくバックスラッシュ)は特別な意味を持ち、 ¥ 記号を表すには 2 回繰り返して記述する必要がある。

この時、編集画面下に「compile」というボタンが出ているはずなので、 それをこづくと作成したマクロが Igor に組み込まれる。 ここで Igor のメニューから「Macros」を開くと「MacBK」(上記で入力した Macro の名前が出てくる)が出てくるはず。 それを選ぶと「Load Waves」のポップアップ画面が開き、 最初のファイル(上記例ではahxx.txt)について各データの wave の名前等が入力された状態でファイルの読み込み準備が終わった状態になっている。 ここで画面下の「Load」をこづくとデータ読み込みが行われ、次のファイルの処理に移る。 (最近の Igor ではエンコードを指定する必要があり、shift-JIS を用いた古い形式のテキストファイルだと途中でエンコード形式を聞かれるかもしれない 2025.11 付記)

上の例ではファイル名があまり系統的に変わっていなかったので一つ一つ入力したわけだが、 CHEMUSB4 の OceanView(あるいは SpectraSuite)で一定時間おきに生成されるスペクトルのデータファイルのように、 ファイル名が *000、*001、*002 といった具合に系統的に変わっていくような場合には次のようなマクロを組むことが考えられる。 このマクロでは同様に compile して MacBK を実行すると OceanView(あるいはSpectraSuite) で生成された ah00000.txt、ah00001.txt、ah00002.txt、…、ah00099.txt から、 スペクトルをそれぞれ bk000、bk001、bk002、…、bk099 という名前の wave に読み込む。

Macro MacBK()
// 変数の宣言
	variable i=0
	string ss
// ループ処理
	do
// ファイル名の生成とGeneral Textとしての読み込み。データは自動生成されたwave0とwave1に
		sprintf ss, "c:\\ah%05d.txt", i
		LoadWave/Q/G/N ss
		// 最近の Igor(ver. 7 以降)では shift-JIS を用いた古い形式のファイルだとエンコードを指定し、
		//「/ENCG=3」を付して「LoadWave/Q/G/N/ENCG=3 ss」とする必要があるかもしれない(2025.11 付記)。
// wave名の生成と自動生成されたwave1の名称変更
		sprintf ss, "bk%03d", i
		Rename wave1 $ss
// ループ回数のカウント
		i+=1
	while (i < 100 )
End

「sprintf ss, "c:¥¥ah%05d.txt", i」の部分を書き換えれば、他のファイル名にも対応できる。 たとえば「sprintf ss, "c:¥¥photo¥¥ktg%03d.txt", i」とすると、 c:¥photo ディレクトリにある ktg000.txt、ktg001.txt、ktg002.txt、…を読み込む 。 (「sprintf ss, "bk%03d", i」の部分を書き換えれば wave の名前が変わる。 たとえば「sprintf ss, "mnk%02d", i」とすれば mnk00、mnk01、mnk02、…、mnk99 というwaveが得られる) このマクロ実行後 wave0 には波長が入っている。

「sprintf ss, "bk%03d", i」の "bk%03d" は C 言語で用いられる書式指定子と呼ばれる部分。 「%03d」は i に格納された数値を 3 ケタの十進数に置き替え、 上位桁をゼロで埋めた形で表現する(リーディングゼロ)という意味。
「$ss」はssの指すメモリーに格納された文字列データを意味する。 このあたりは C 言語をかじった人はポインターとの関連でよくご存知かもしれない。


表紙のページへ