- ベストアンサー
リトルエンディアンのデータをテキスト変換して利用したい
- リトルエンディアンのデータをテキスト変換して、Accessの標準モジュールに取り込みたいです。
- VBAを使用して、バイナリファイルを読み込み、テキストに変換することが可能です。
- 秀丸エディタのバイナリモードで表示されるデータを、固定長の定義に従ってテキストファイルに書き出し、DBに取り込むことができます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
先に提示したソースでは、1レコードが48バイト(2バイト整数が14個と20バイトの文字列)で、同じレコードが複数存在すると仮定しています。 最初に提示されたバイナリデータが48バイトでしたのでこれを1レコードと想定 >住所の前がすべて2バイトの整数であれば・ 住所の前28バイトを見てみると、2バイトの整数と思われるデータが連続しています。 ただ、"A1,62,9F,53"の部分は2バイト整数でない可能性もかなりあります。 最初は浮動小数点かと思いましたが、PCなどで使用する4バイトの浮動小数点と 仮定すると"1369109037056.000000"となるので、ちょっと違いそうです。 #そういう意味でこの4バイトが何かは不明です (文字列でもなさそう) 元のデータがどんなフォーマットかは判りませんが、単純な固定長の繰り返し (1レコードがnバイトでmレコード続く)でなければ、プログラムはもっと 面倒になります。 単純な繰り返しであれば、 Type Rcd dt(13) As Integer adr As String * 20 End Type の部分に1レコード分のフォーマットを定義します。 ここの定義をどう記述するかは実際のデータ(1レコード分)で考える必要があります。 いずれにせよ、データの定義とその実データの一部(1レコード分)もしくは その部分をバイナリエディタで見たデータがないとそれ以上は進みません。
その他の回答 (2)
- equinox2
- ベストアンサー率48% (321/660)
やはり気象庁のデータでしたか。 10年くらいに似たようなデータを見せられたどうすれば読めるか相談されたことがあります。 ACCESSのvbaならこんな感じでテキストに変換できると思います。 #住所の前がすべて2バイトの整数であれば・・ (ACCESS2003を使用し質問に書かれたデータの繰り返しで確認) Type Rcd dt(13) As Integer adr As String * 20 End Type Public Sub Bin2Tex() Dim Rd As Rcd Dim i As Integer Rfn = FreeFile Open "c:\temp\dd.dat" For Random As #Rfn Len = Len(Rd) Wfn = FreeFile Open "c:\temp\dd.txt" For Output As #Wfn Do Get #Rfn, , Rd If EOF(1) Then Exit Do For i = 0 To 13 Print #Wfn, Rd.dt(i); Next i Print #Wfn, Rd.adr Loop Close #Wfn Close #Rfn End Sub
お礼
コードまで呈示していただいて、本当にありがとうございます! 今ここにある環境では、すぐには試せないのですが、ご呈示いただいたデータをまずはよく読んで、早速、明日にでも実データでトライしてみます。 あちこちで躓きそうな予感はしておりますが(~~;、がんばってみます。 その結果をまたここでご報告したいと思います。
補足
そんなお礼を申し上げつつ、やっぱりなるべく早く確認したいと思い、自宅のAccess2000の環境で実験してみました。 モジュールはエラーなく動作しました。まずは、改めて感謝申し上げます。 例示した3行分のデータだと、なるほどここまでが含まれているということがわかりました。 ためしにファイル全体を用いてみると、いわゆる文字化けになった箇所が出てきます。 定義書は手元にないのですが、確か、1レコードは、膨大な桁数で、それはたぶん「1レコード=1ファイル」に該当するものと思われます。 また、定義書には、データのうち一部はテキスト、という説明があります。 1)ということは、定義に従って、適宜変換をする部分と、変換しないでそのままテキストとして読んで書き出す、という分岐が必要という意味になるでしょうか? 2)ご回答の中で、「#住所の前がすべて2バイトの整数であれば・・」とおっしゃっているのは、どのような懸念でしょうか? たびたびで恐縮です。ご示唆いただければ幸いです。
- equinox2
- ベストアンサー率48% (321/660)
>「リトルエンディアン」という形式のバイナリファイルです。 これだけの情報では何バイト区切りもしくはデータ型式が判りません。 どんな目的で作られたデータかが判るともう少し推定しやすいかも・・ ぱっと見では、 ・最初の10バイトは16ビットの整数 ・次の4バイトは不明 ・次の8バイトは16ビットの整数 ・最後の20バイトはsfift-JISの文字(漢字) "北海道稚内市開運2丁" 読み方は、データのフォーマットが判ってから・・
補足
さっそくの書き込みありがとうございます。 このデータは、具体的には、次のような情報が得られるものです。 http://www.jmbsc.or.jp/hp/offline/sanpl/jinitibetugennbotoukyou.pdf 必要なのはこの中の4種類のデータです。 また、ファイル数は50ほどあります。 このファイルは、バイナリ(リトルエンディアン)一部テキストを含む、ということが資料に書いてありました。 バイト区切りの資料を見て、月曜日以降にまたここに補足を書きます。
お礼
丁寧に説明してくださって、本当にありがとうございました。 週あけから別件にかかりきりで、具体的な実験がまだ進んでいないのですが、ここでいったんお礼を申し上げます。 少し自力で進めて、またつまづいたら(どのくらい進められるかわからないのですが)、質問させていただくかと思います。 どうもありがとうございました。