バイナリファイルをテキストファイルに変換したい!fortranでやってみよう。
みなさん、こんにちは。チャリおじさんです。
今回は、バイナリファイルをテキストファイルに変換するfortranプログラムをご紹介します。
レーダーエコーとかMSMとかJRAとか、多くの気象データはバイナリファイルで提供されています。
それを統計処理するには、このテキストファイルに変換する操作が必須です。
ここでは例として、「気象庁が公開している全国合成レーダーGPVのバイナリデータを、fortranでテキストファイルに書き出すプログラム」をご紹介したいと思います。
バイナリデータについて
レーダーエコー値が記録されている、拡張子が.binになっているファイルのことです。
このバイナリファイル、普通にviとかエディタで開いても、中身を見ることができません。
なので統計解析したいときは、バイナリファイルそのままでは計算できないのです。
よってこのバイナリファイルをfortranを使って、中身が読めるようにテキストファイルに書き出します。
バイナリファイルの構成と変換
バイナリファイルは、010101...のように0と1の羅列がずっと並んでいて、2進法で書かれています。
途中に特に区切りや改行はなく、0と1が永遠に続きます。
これを計算できるようにするためには、10進法に変換する必要があります。
2進法と10進法の関係として、「2進法の32桁で10進法の1つの値を表す」というのがあります。(これについて詳しくは他のサイトを参照してください。)
なので、0と1の羅列を32桁ごとに区切って読めば、2進数を10進数に変換することができます。
2進法の1桁は1bitです。なので32桁は32bitです。さらに8bit=1byteです。なので32桁は4byteになります。
よってfortranのプログラムでは、変数定義の際に、「これは4byteの変数ですよ」と宣言してあげれば、2進法のデータが10進法に変換されて入力されます。
全国合成レーダーGPVとは
要は雨雲レーダーのことです。
気象庁が提供するデータですが、こちらのサイト(京都大学)で無料で取得することができます。
バイナリファイルの中にはレーダーエコー値(dbZ)が羅列されています。
プログラムの中で、緯度経度を計算して、「緯度 経度 値」のように出力できれば、今後の統計解析で役立つでしょう。
プログラム
オレンジ色は入力するデータに合わせて値を入力する箇所です。適宜変更してください。
青色の箇所について、プログラムの下に説明をまとめています。
ーーー
program
implicit none
integer, parameter :: x=(経度グリッド数), y=(緯度グリッド数) !(1)
integer :: i, j
real :: lat, lon
real(kind=4), dimension(x,y) :: figure !(2)
open(unit=11,file='infile.bin',form='unformatted',access='direct',status='old',recl=x*y*4) !(3)
open(unit=31,file='outfile.txt',status='replace') !(4)
read(unit=11,rec=1) figure
do j = 1, y
lat = (南端の緯度) + (緯度間隔)*(j-1) !(5)
do i = 1, x
lon = (西端の経度) + (経度間隔)*(i-1) !(5)
write(31,'(f11.6,f11.6,f10.4)') lat, lon, figure(i,j) !(6)
end do
end do
end program
ーーー
以上です。
ポイント
(1)x,yは定数です。縦横のグリッド数を入力してください。
(2)kindは種別値といって、byte数を指定するものです。
(3)バイナリファイルは「書式なしファイル」なので、「form='unformatted'」を指定します。
「access='direct',recl=x*y*4」によって、レコード長が4byteに固定されます。
(4)出力ファイルは通常通りopenします。別に10進数とか宣言しません。
(5)レーダーエコー値を緯度と経度と並べて出力します。バイナリデータには緯度経度の情報は入っていないので、自分で入力する必要があります。
(6)ほしいレーダーエコー値の桁数に合わせて、編集記述子(f11.6とか)を変更してください。
最後に
いかがでしたか?
これできっと、「緯度 経度 レーダーエコー値」という値が羅列したテキストファイルが出力されたでしょう。
それではまた次回、チャリおじさんでした。