リトルエンディアンのデータをテキスト変換して利用したい

このQ&Aのポイント
  • リトルエンディアンのデータをテキスト変換して、Accessの標準モジュールに取り込みたいです。
  • VBAを使用して、バイナリファイルを読み込み、テキストに変換することが可能です。
  • 秀丸エディタのバイナリモードで表示されるデータを、固定長の定義に従ってテキストファイルに書き出し、DBに取り込むことができます。
回答を見る
  • ベストアンサー

リトルエンディアンのデータをテキスト変換して利用したい

いつもお世話になっています。 ある観測生データが「リトルエンディアン」という形式のバイナリファイルです。 これをテキストに変換して、DBに取り込んで利用したいです。 環境としては、Accessの標準モジュールにその機能を作りたいです。 (Visual Basicなどは持っていないので^^;) やりたいことは、 1)当該のファイルを読み込んで、 2)テキストに変換した後、 3)テキストファイルに書き出して、 4)再度それを固定長の定義に従ってDBに取り込んで、 5)必要なフィールドのみ利用したい、 ということです。 この流れのうち、1)と2)がわかりません。 VBAで上記の1)、2)は可能でしょうか? 可能だとしたら、どのような方法がありますか? 3)以降は、Open やPutなどでテキストファイルを書き出すのと同じでよいでしょうか? なお、秀丸エディタのバイナリモードでファイルを開くと、次のように見えます。(行末に必ず","があります) 91,01,D7,07,02,00,07,04,00,00,A1,62,9F,53,1C,00, 75,00,0F,00,12,00,EA,00,E9,00,80,1F,96,6B,8A,43, 93,B9,92,74,93,E0,8E,73,8A,4A,89,5E,82,51,92,9A, いかがでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • equinox2
  • ベストアンサー率48% (321/660)
回答No.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レコード分)もしくは その部分をバイナリエディタで見たデータがないとそれ以上は進みません。

Cirq1646
質問者

お礼

丁寧に説明してくださって、本当にありがとうございました。 週あけから別件にかかりきりで、具体的な実験がまだ進んでいないのですが、ここでいったんお礼を申し上げます。 少し自力で進めて、またつまづいたら(どのくらい進められるかわからないのですが)、質問させていただくかと思います。 どうもありがとうございました。

その他の回答 (2)

  • equinox2
  • ベストアンサー率48% (321/660)
回答No.2

やはり気象庁のデータでしたか。 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

Cirq1646
質問者

お礼

コードまで呈示していただいて、本当にありがとうございます! 今ここにある環境では、すぐには試せないのですが、ご呈示いただいたデータをまずはよく読んで、早速、明日にでも実データでトライしてみます。 あちこちで躓きそうな予感はしておりますが(~~;、がんばってみます。 その結果をまたここでご報告したいと思います。

Cirq1646
質問者

補足

そんなお礼を申し上げつつ、やっぱりなるべく早く確認したいと思い、自宅のAccess2000の環境で実験してみました。 モジュールはエラーなく動作しました。まずは、改めて感謝申し上げます。 例示した3行分のデータだと、なるほどここまでが含まれているということがわかりました。 ためしにファイル全体を用いてみると、いわゆる文字化けになった箇所が出てきます。 定義書は手元にないのですが、確か、1レコードは、膨大な桁数で、それはたぶん「1レコード=1ファイル」に該当するものと思われます。 また、定義書には、データのうち一部はテキスト、という説明があります。 1)ということは、定義に従って、適宜変換をする部分と、変換しないでそのままテキストとして読んで書き出す、という分岐が必要という意味になるでしょうか? 2)ご回答の中で、「#住所の前がすべて2バイトの整数であれば・・」とおっしゃっているのは、どのような懸念でしょうか? たびたびで恐縮です。ご示唆いただければ幸いです。

  • equinox2
  • ベストアンサー率48% (321/660)
回答No.1

>「リトルエンディアン」という形式のバイナリファイルです。 これだけの情報では何バイト区切りもしくはデータ型式が判りません。 どんな目的で作られたデータかが判るともう少し推定しやすいかも・・ ぱっと見では、 ・最初の10バイトは16ビットの整数 ・次の4バイトは不明 ・次の8バイトは16ビットの整数 ・最後の20バイトはsfift-JISの文字(漢字)   "北海道稚内市開運2丁" 読み方は、データのフォーマットが判ってから・・

Cirq1646
質問者

補足

さっそくの書き込みありがとうございます。 このデータは、具体的には、次のような情報が得られるものです。 http://www.jmbsc.or.jp/hp/offline/sanpl/jinitibetugennbotoukyou.pdf 必要なのはこの中の4種類のデータです。 また、ファイル数は50ほどあります。 このファイルは、バイナリ(リトルエンディアン)一部テキストを含む、ということが資料に書いてありました。 バイト区切りの資料を見て、月曜日以降にまたここに補足を書きます。

関連するQ&A

  • Javaでのエンディアン変換

    こんばんは☆ Javaでのエンディアン変換をご教授ください。 ファイルを読み込み、ソケット通信でサーバへデータ送信しています。 リトルエンディアンで送らなければいけないのですが、 Javaはプラットフォーム問わずにビッグエンディアンでメモリに格納するとありました。 そこで、バイトオーダーをしようと思い、 stirlingというバイナリエディタでバイナリファイルを作成して以下の2点で試しました。 <バイナリファイル構造体> struct stest { LONG l1; LONG l2; LONG l3; LONG l4; }; <バイナリデータ(数値)> 1234 (010000020000030000040000)←バイナリエディタで見たとき <テスト1結果> ・・・new InputStreamReader(in, "UnicodeLittle"); >1000200030004000 <テスト2結果> ByteBuffer buffer = ByteBuffer.wrap(bt); buffer.order(ByteOrder.LITTLE_ENDIAN); buffer.get(); >1000200030004000 これはリトルエンディアンなのでしょうか? どちらも、 Javaで読み込み時にエンディアン指定しない時と出力結果に違いがありませんでした。 なぜでしょうか? ちなみに、データ型を意識せずに変換したいです。 色々と調べたのですが、良く分かりません。 どなたかご教授お願いいたしますm(_ _)m

    • ベストアンサー
    • Java
  • 最近のCPUのほとんどはリトルエンディアンかビッグエンディアンでしょうか?

    2000年あたり以降に出た Windows, Mac, Linuxに使われているCPUのほとんどはリトルエンディアンかビッグエンディアンでしょうか? また、たとえば以下のような方法でエンディアンを調べられると考えていいのでしょうか?(VC++です) #include <windows.h> void GetEndian4(char* c){ unsigned __int32 a=0x03020100; BYTE *b = (BYTE*)&a, i=4; while (i--) c[i]=b[i]; } ////////// const char e[4]={}; GetEndian4( const_cast<char*>(e) ); //eが 0,1,2,3 になればリトルエンディアン //3,2,1,0 になればビッグエンディアン //PDP-エンディアンだと 2,3,0,1 …のはず (または2択ならこれだけでも判断可能…?) short s=1; printf( *(char*)&s ? "リトルエディアン\n" : "ビッグエディアン\n" ); あとここでもアラインメントの問題が絡みますが、このように アラインメントが(2のべき乗だとして)大きいであろう方から小さいであろう方にキャストする分には安全で、逆に sizeof(short) == sizeof(char)*2 として char c[2]={1,0}; short s=*(short*)&c; というのは危険な場合がある、ということでしょうか? また、その場合は たとえばビッグエンディアンなら short s=(c[0]<<8)|c[1]; とすればいいでしょうか?

  • N88BASICのバイナリデータをテキストに変換

    N88BASICで作成したプログラムを読みたいのですが、バイナリで保存しており、現在のWindows環境(Windows2000)では読めません。 N88BASICのバイナリデータをテキストデータに変換する方法を知っている方がいらっしゃれば教えてください。 有料で取り扱ってくれるところはあるようなのですが、できればタダで変換したいなぁと考えています。 テキスト形式(アスキー?)に変換できればよいだけです。Windowsで動くようにする等は、既に知っていますので。。。 よろしくお願い致します。

  • JAVAのdouble型情報をリトルエンディアンでバイナリへ出力の方法

    JAVAでdouble型の情報をリトルエンディアンでバイナリとして出力する方法を教えてください。 現在、java.io.DataOutputStreamを使用し、writeDoubleで出力していますが、ビックエンディアンとしてしか無理でした。 読み込むのはテキスト型で出力がバイナリ。 現在のソースの簡易フローチャートを書いて置きます。 START ↓ テキストファイルから特定の文字列を取得する(1 , 7 , 5.5等) ↓ 取得した文字列をそれぞれ対応の型に変換する int top = Integer.parseInt("1"); int sub = Integer.parseInt("7"); double miks = Double.parseDouble("5.5"); ↓ バイナリのフォーマットに合わせて出力する int型は4バイトでビックエンディアン。 double型は8バイトでリトルエンディアン。 例えば、デフォルトのビックエンディアンで出力した時、数字の1は 00 00 00 01 になりますが、 リトルエンディアンで出力した時は、 01 00 00 00 になると思います。 変換するタイミングとしては、書き込む時にオリジナル機能(メソッド)で書き込むデータ(int型やdouble型)とビックかリトルを指定して、バイナリに出来るものを探しています。 PS 現在の質問はソースを上げるのが一番とは思いますが、社外秘のソースなので、公開することは出来ません。 PPS 私の質問に対する質問があれば、より詳細に答えていくつもりです。 以上、宜しいお願い致します。

    • ベストアンサー
    • Java
  • エンディアンについて

    すみません。 教えてください。 リトルエンディアンからビッグエンディアンに変換しないと いけません。 エンディアンについては勉強したつもりですが、 どうしてもわからないことがあります。 ご存知の方、教えていただせんか? CPUはリトルです。 まず、エンディアンの違いについては 以下のように認識しています。 x = 0xAABBCCDD メモリの配置方法が、 トリルだと DD CC BB AA ビックだと AA BB CC DD だと思っています。32ビットの場合です。 で、これを変換するには、htonlで変換可能だと思っっています。 (試したところ可能でした) で次に、32ビットを超えるデータ、たとえば100バイトとかを mallocにして変数に代入しました。 この時はエンディアン変換(ファイルに出力する際)は必要ないのでしょうか? 試しに出力すると、 x = 0x AA BB CC DD EE FF GG ・・・・・・ZZ (100バイトと仮定) バイナリでの出力結果は AA BB CC DD EE FF GG ・・・・・となっていました。 私の認識だと、本CPUはリトルエンディアンのため、 ZZ ・・・・・・・・ DD CC BB AA (四バイトずつ反転しているデータ) が出力されるものと思っていました。(反転してメモリに格納されるため) リトル/ビックを意識しないといけないのは、 2バイトや4バイトの時のみで、それを超える大きなデータ(100バイト)などは 意識せず、そのままバイナリ出力しても、ビックエンディアンで出力されると いうことでよろしいでしょうか? そうなると、エンディアンってなんだんだ???と混乱しています。 わかりにくい説明で大変申し訳ござませんが、 よろしくお願いいたします。

  • ビッグエンディアンをPCで処理する問題

    ビッグエンディアンと指定されているバイナリファイルがあります。 これをPC(intel系,Linux or Windows)で処理する場合、エンディアンの変換が必要だろうと思います。具体的にはどのようにするのでしょうか。ネットでもダウンロードできそうですが。 変換コマンド -btol ファイル名(ビッグ)> ファイル名(リトル) という感じですかね。こんなものあるでしょうか。 購入したバイナリファイルなのですが、このご時勢たいていPCで処理するわけでしょうからリトルであってほしいものだと思いますが。 ところでMACはビッグとリトルのどっちなのでしょうか。

  • テキストデータをバイナリデータに変換したい

    テキストファイルに以下のデータがあるとします。 テキストデータの中身、 「 000E6D4181AA,1234567890ABCDEF 0123456789AB,0100000000000000 050505AAAAAA,0200000000000000 070707BBBBBB,0300000000000000 012345CCCCCC,0400000000000000 cdef01DDDDDD,0500000000000000  ・  ・  ・ 」 12桁の数値(16進数)と16桁の数値(16進数)を「,」で区切ります。1行の終端は改行しています。 このテキストファイルにあるデータを以下のバイナリ形式に変換させたいのです。バイナリ形式の各行の16バイト目は、テキストデータにはデータがないので、「00」とします。「,」で区切ったバイナリ形式は「2C」になると思います。 テキストデータの左上から順に「00」は以下の、左上から順の「00」に対応します。 バイナリデータの中身、 「 00 0E 6D 41 81 AA 2C 12 34 56 78 90 AB CD EF 00 01 23 45 67 89 AB 2C 01 00 00 00 00 00 00 00 00 05 05 05 AA AA AA 2C 02 00 00 00 00 00 00 00 00 07 07 07 BB BB BB 2C 03 00 00 00 00 00 00 00 00 01 23 45 CC CC CC 2C 04 00 00 00 00 00 00 00 00 CD EF 01 DD DD DD 2C 05 00 00 00 00 00 00 00 00  ・  ・  ・ 」 ソースコードでの例、 テキストデータ1行目の1つ目の「,」までのデータ「000E6D4181AA」を、メモリ領域に読み込む。2桁の数値を1バイトで格納する。 つまり、 char buf[6]とすると、 buf[0]=0xAA buf[1]=0x81 buf[2]=0x41 buf[3]=0x6D buf[4]=0x0E buf[5]=0x00 とこのようにメモリに格納したいのです。 格納するバイトオーダーはリトルエンディアン方式とします。 以上で、質問を終わりますが、質問が上手くできていないと思いますので、説明に不備があるかもしれません。その時はお手数ですが、連絡下さい。

  • カンマを改行に変換する方法

    テキストファイルの中にあるカンマ(,)を改行に変換する方法を教えてください。 具体的には次のようなCSVファイルがあります。 A,B C,D E,F これを A B C D E F と変換したいのです。 EXCELを使ってもかまいません。よろしくおねがいします。

  • テキストデータなのですが、

    途方に暮れてます。教えて下さい。 VB6にて、テキストファイルを読み込みます。 改行の部分はReplace(テキストファイル, vbLf, vbNewLine)として、 改行しました。(私はバイナリの扱いをほとんど知りません) 次に問題となったのが、バイナリエディタで見てみると、00という空白 文字です。(ドットかはっきりわからないのですが、.となってます) この空白文字を素直に空白文字としたいのですが、空白が削除されて 変換されます。 前 ABCDEF 後ABCDEF といった感じです。 そのままの状態で改行のように、空白文字を変換したいのですが、 どうすればよいでしょうか? 私自身、バイナリについてわかっていないので、内容がわかりにくい と思いますが、どうぞよろしくお願いします。

  • テキストファイルのデータからバイナリを作りたい

    現在、テキストデータとしてCSVファイル1つあたり8バイトのデータが1000個ほどのデータが書かれているファイルがあります。このデータをバイナリファイルへ数値も変換して行きたいと思っています。 たとえば1個目のデータ”12345678”というテキストデータをバイナリの"12345678"に変換したらそれを0x00番地に並べて、そして2個目のデータ”87654321”というデータをバイナリにしたらそれを0x90離れた場所に置いていき、それを1000回繰り返して、結果をバイナリファイルで出力したいのですが、何か簡単にできるフリーソフトなどありませんでしょうか? また、プログラムとかでも簡単にできるのならそうしたいのですが、どうしたらよいか教えていただけないでしょうか?

専門家に質問してみよう