いつもお世話になっています。
ある観測生データが「リトルエンディアン」という形式のバイナリファイルです。
これをテキストに変換して、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,
いかがでしょうか?
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レコード分)もしくは
その部分をバイナリエディタで見たデータがないとそれ以上は進みません。
丁寧に説明してくださって、本当にありがとうございました。
週あけから別件にかかりきりで、具体的な実験がまだ進んでいないのですが、ここでいったんお礼を申し上げます。
少し自力で進めて、またつまづいたら(どのくらい進められるかわからないのですが)、質問させていただくかと思います。
どうもありがとうございました。
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
この回答への補足
そんなお礼を申し上げつつ、やっぱりなるべく早く確認したいと思い、自宅のAccess2000の環境で実験してみました。
モジュールはエラーなく動作しました。まずは、改めて感謝申し上げます。
例示した3行分のデータだと、なるほどここまでが含まれているということがわかりました。
ためしにファイル全体を用いてみると、いわゆる文字化けになった箇所が出てきます。
定義書は手元にないのですが、確か、1レコードは、膨大な桁数で、それはたぶん「1レコード=1ファイル」に該当するものと思われます。
また、定義書には、データのうち一部はテキスト、という説明があります。
1)ということは、定義に従って、適宜変換をする部分と、変換しないでそのままテキストとして読んで書き出す、という分岐が必要という意味になるでしょうか?
2)ご回答の中で、「#住所の前がすべて2バイトの整数であれば・・」とおっしゃっているのは、どのような懸念でしょうか?
たびたびで恐縮です。ご示唆いただければ幸いです。
コードまで呈示していただいて、本当にありがとうございます!
今ここにある環境では、すぐには試せないのですが、ご呈示いただいたデータをまずはよく読んで、早速、明日にでも実データでトライしてみます。
あちこちで躓きそうな予感はしておりますが(~~;、がんばってみます。
その結果をまたここでご報告したいと思います。
No.1
- 回答日時:
>「リトルエンディアン」という形式のバイナリファイルです。
これだけの情報では何バイト区切りもしくはデータ型式が判りません。
どんな目的で作られたデータかが判るともう少し推定しやすいかも・・
ぱっと見では、
・最初の10バイトは16ビットの整数
・次の4バイトは不明
・次の8バイトは16ビットの整数
・最後の20バイトはsfift-JISの文字(漢字)
"北海道稚内市開運2丁"
読み方は、データのフォーマットが判ってから・・
この回答への補足
さっそくの書き込みありがとうございます。
このデータは、具体的には、次のような情報が得られるものです。
http://www.jmbsc.or.jp/hp/offline/sanpl/jinitibe …
必要なのはこの中の4種類のデータです。
また、ファイル数は50ほどあります。
このファイルは、バイナリ(リトルエンディアン)一部テキストを含む、ということが資料に書いてありました。
バイト区切りの資料を見て、月曜日以降にまたここに補足を書きます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
エクセルシート名の制限を変更...
-
CRC計算方法
-
3バイト文字(UTF-8)をprintfで...
-
COBOLのCOMP形式について
-
VB6で漢字の1バイト目か2バイト...
-
char str[256]の256の意味は?
-
64bit対応
-
CD R の書き込み
-
C言語でファイルをよんだあとの...
-
ビットスワップとバイトスワッ...
-
GetWindowTextでアドレスバーか...
-
C言語において2バイト文字を検...
-
C# で MSSQL から XML 出力で、...
-
memcmp バイナリデータの比較方法
-
100MB
-
PICマイコンで変数値の保持
-
sedコマンドで全ての2バイト文...
-
VBAでUnicodeしか存在しない文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルシート名の制限を変更...
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
COBOLのCOMP形式について
-
char str[256]の256の意味は?
-
バイト列とバイナリ列の違いが...
-
ピクセル,dpiから容量(バイト...
-
「1TB」のHDDに日本語は何字入...
-
Javaで日本語1文字のバイト数
-
機種依存文字をチェックしたい。
-
PICマイコンで変数値の保持
-
【VB2005】テキストボックス内...
-
SQLで1バイト、2バイト混在...
-
ビットスワップとバイトスワッ...
-
VBAでShift-JISのURLエンコード
-
GetWindowTextでアドレスバーか...
-
C++ Builderで文字列をバイトに...
-
64bit対応
-
UCS-2の一覧表が欲しい
-
VB.NET LeftBの代用
おすすめ情報