« 都市伝説いろいろ コーラを飲むと歯が溶ける? | トップページ | 上海リニアモーターカーに乗ってきた »

2007年6月27日 (水)

バイナリ形式のデータファイルをテキスト形式に変換する Excel VBAを使って

うちの実験室に、他所から粉末X線回折装置(島津XD-D1)を移設した。1994年の装置だが、粉末X線回折の装置自体は技術面で何の進歩もないので、今でも問題なく使うことができる

問題は制御用PC。EPSON製の98互換機PC-486で、MS-DOS Ver.5で動いている。フロッピーは3インチだが、なぜかPC-98用として市販されている2HDディスクは読んでくれず(フォーマットもできない状態)、仕方ないので2DDディスクを使用することになった。(もっと昔、90年前後の島津製の測定装置はフロッピーがMS-DOSやWindowsで読めない形式になっていて非常に苦労したものである。Windowsで読むには、FDCの部分をマシン語で書き換える必要があると言われてあきらめた。)

ちなみに、このXRD装置、インターフェースは島津独自の当時のPIOで、PCを最新のものにバージョンアップするのは不可能とのことであった(メーカー談)。PCが壊れたら、中古の完全動作品を買うことになるのだろうか。

とにかくPCが古いので、測定データだけでも、最近のPCに移して処理したいと考えた。しかし、測定データをテキスト形式(ASCII、アスキー形式)に変換するソフトが付属していないのであった。これではExcelに読み込めないし、データ解析もできない。測定データは、いわゆるバイナリ形式で、普通にPCで読もうとすると文字化けするのである。

メーカーに聞いたが、当時のアスキー変換ソフトは、メーカー側には残っていないと、つれない返事。

仕方がないので、自分でプログラムを組むことにした。大学院時代に習得したノウハウが今、役に立つとは思ってもみなかった。お前は准教授になっても、まだそんなことをやっているのかと言われてしまいそうだが・・・。

■ 昔のPCはファイルがよく壊れて、自分で修復した

フロッピーを使って、BASICのプログラムを実行しているとき、プログラム中でFILEをOPENしたまま、CLOSEしない状態で、フロッピーを入れ替えたりすると悲惨なことになった(覚えている方も多いと思う)。後から入れたフロッピーのディレクトリとFATが、前のフロッピーの内容に書き換わってしまうのである。ディレクトリは、本で言えば目次のようなもの。フロッピーは本とは違って、ページ順に書き込まれるとは限らないので、このページの次は、このページというような順序がディレクトリとは別に書き込んである。これが、FATである。私は昔、修士論文執筆中、修士論文のファイルを上に書いたミスで壊してしまい、ディレクトリとFATを必死に修復したことがある。ディレクトリとFATが変わっただけで、内容自体は消えずに残っているから、コツさえつかめば簡単に修復できた。そのとき使ったソフトは確か「エコロジーII」と言った。こんな話を人にしたら、ファイルを壊してしまった人が直してくれとやってくることがよくあった。

■ バイナリ形式とテキスト形式

英数字をPCが記録するとき、その1文字1文字を、2桁の16進数の数字に置き換えて、記録している。これをキャラクターコードという。例えば、1なら"31"、2なら"32"、3なら"32"、Aなら"41"である。112という数値を記録したければ、"31 31 32"となるが、これでは3文字分(3バイト分)のスペースが必要になる。これがテキスト形式。

記憶容量が限られていた時代は、測定データをテキスト形式で記録することはあまりやられていなかった。フロッピーがすぐ一杯になるからである。112と記録したいときに、これを16進数に変換して、"70"と記録すれば、1文字分(1バイト分)で済む。これがバイナリ形式のデータである。キャラクターコードで70に対応するのはpだから、もしこれをメモ帳(Notepad)などで読もうとするとpと表示されてしまう。キャラクターコードでは文字に対応しない数字もあるから("08"ならバックスペースBSに対応)、バイナリ形式はWordやメモ帳で読むのは無理である。

バイナリ形式は上のようなデータに限らず、圧縮ファイルや実行形式のファイル(EXEファイル)もバイナリ形式である。

■ バイナリ形式のファイルを読むには

バイナリエディタと呼ばれるエディタを使用する。私はフリーソフトのStirlingを使用した。非常に軽いバイナリエディタである。バイナリエディタは、対応する文字がある場合は、その文字を右側に表示してくれる。バイナリ形式のファイルであっても、はじめの方はテキスト形式で何か書き込まれていることが普通である。

■ バイナリ形式のデータの例

Bin2txt

このデータは、28°~29°まで、0.01°stepで101個の強度データを取ったもの。

最初の384バイト(0~17Fまで)がテキスト形式で、測定条件、コメントなどが記録されている。

次からデータの保存部分になり、128バイトが、一つのユニットになっている。4バイトで一つの数値を表すようになっているが、このユニットの先頭に2つ測定角度を記録して、その後に順に30個の数値が記録されている。

4バイトで一つの数字(長整数型Long)だが、数値に直すときは次のような計算になる。

"68 36 02 00"なら、それぞれを10進数に直して、"104  54  2  0"だが、これで記録されてる数値は

104 + 54 * 256 + 2 * 256 * 256 + 0 * 256 * 256 * 256 = 145000となる。はじめの方の数字が下位である。

同様に"71 48"は29000となる。最初の2つの数値は角度である。

その後に30個強度データが続く。

これの繰り返しである。

こういう風に、データがどのように保存されているかを、実際の数値データとつき合わせながら、「解読」するわけである。

で、4バイトのコードを、1つの数値に計算しなおす上の計算を、いちいちプログラムの中でやる必要があるのかと思っていたが、その必要はなかった

■ バイナリをテキスト形式に変換するExcel VBA(マクロ)プログラム例 

Excel VBA(マクロ)でプログラムを組んでみた。

非常に便利なことに、Excel VBAではファイルをバイナリモードでオープンするという指定ができる(バイナリファイルの入出力 参照)。数値Aを長整数型(Long、4バイト使用する)に定義して、バイナリモードでファイルをオープンし、Aを読み込むと、上の計算をしなくても自動的に数値に変わってくれるのである。

以下のプログラムでは、ファイル名はプログラム内で指定し、結果はExcelのワークシート上に出力するようになっている。島津XD-D1のデータ用に特化してあるが、一部変更すれば汎用性はある。

以下の手順で実行できる。

  1. Excelの[表示]→[ツールバー]→[Visual Basic]で、VBAのメニューバーを表示、Visual Basic Editorのアイコンをクリックする。Visual Basic Editor上で[挿入]→[標準モジュール]、さらに[挿入]→[プロシージャ]でSub、Publicを選択し、名前を適当に入力して、下記プログラムをコピー&ペースト(最初と最後の1行は重複するので削除)
  2. メニューバーからプログラムを実行する(▲が横向きのアイコン)。

Public Sub bin2txt()
Dim a As Long  '長整数型(1数値に4バイト使用)
'****** 次行でファイル名をドライブ名とともに指定する ******
Open "C:\PD001.P00" For Binary As #1  'バイナリモードでオープン
For i = 1 To 96  '先頭384バイトにあるコメントをスキップ
  Get #1, , a
Next i
unum = (LOF(1) - 384) / 128 'ファイルの長さを調べる
For i = 1 To unum
  Get #1, , a
  Get #1, , a
  Cells((i - 1) * 30 + 1, 3) = a / 1000
    For j = 1 To 30
      Get #1, , a
      If a <> 538976288 Then Cells((i - 1) * 30 + j, 4) = a Else GoTo TheFinal
      'データが空白になるまでデータを読み込み続ける (538976288 = "20202020")
    Next j
Next i
TheFinal:
  inum = i: jnum = j
  num = (inum - 1) * 30 + jnum - 1
  th2 = Cells(1, 3) 
'測定終了角度
  step = (th2 - Cells(31, 3)) / 30 
'測定角度のステップ
  th1 = th2 - step * (num - 1) 
'測定開始角度
  For i = 1 To num
    Cells(i, 1) = th1 + step * (i - 1)
    Cells(i, 2) = Cells(num - i + 1, 4)
  Next i
  For i = 1 To num
'計算用紙として使った部分をクリア
    Cells(i, 3) = "": Cells(i, 4) = ""
  Next i
Close #1
End Sub

|

« 都市伝説いろいろ コーラを飲むと歯が溶ける? | トップページ | 上海リニアモーターカーに乗ってきた »

コメント

此のホームページを観まして、教えて頂きたい事があります、自家製レーザースキャナーを持ちますが、此の反射データを取り込み点群画像としたいのですが、ソフトウェアはこれから購入します、此のソフトはアスキーフォーマットです、ですのでアスキーに変換しましてソフトに入れなければなりませんが、レーザースキャナーXYZ反射データを、アスキーに変換できます、変換ソフトウェアのご紹介を願えればと思います。宜しくお願いします。
電話、080-1189-0519

投稿: 本山英義 | 2010年11月11日 (木) 20時23分

メール下さい。

投稿: 本山英義 | 2010年11月11日 (木) 20時27分

まだ、アスキー変換ソフトウェアは存在しますが。

投稿: 本山英義 | 2010年11月11日 (木) 20時34分

まだアスキーフォーマット変換ソフトウェアは存在しますが。

投稿: 本山英義 | 2010年11月11日 (木) 20時35分

speの拡張子をもつXPSのファイルを、
こちらのページにあるコードを使わせていただきまして、
変換してみましたが、数字に変換できるものの、
よく分からない数字になります。
何か方法はございませんでしょうか?

投稿: abe | 2015年4月13日 (月) 13時55分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/187788/15576559

この記事へのトラックバック一覧です: バイナリ形式のデータファイルをテキスト形式に変換する Excel VBAを使って:

» カラフルフルーツ [捜査筋]
民間人は今年 この判断により 犯行 [続きを読む]

受信: 2007年6月30日 (土) 09時21分

« 都市伝説いろいろ コーラを飲むと歯が溶ける? | トップページ | 上海リニアモーターカーに乗ってきた »