Act 2000 から MySQL データベースにデータを変換しようとしています。DBF ファイルを個々の MySQL テーブルに正常にインポートしました。しかし*.BLB
、標準外のメモ ファイルと思われるファイルに問題があります。
DBF ファイルは、自分自身を dbase III Plus、No memo 形式として識別します。*.BLB
複数の DBF が BLOB データを共有するためのメモ ファイルが1 つあります。
このドキュメントを読んだ場合: http://cicorp.com/act/sdk/ACT6-SDK-ChapterA.htm#_Toc483994053 )
REGARDING
列が 6 文字の列であることがわかります。説明は次のとおりです。この 6 バイトのフィールドはシステムによって提供され、バイナリ ラージ オブジェクト (BLOB) データベース内のフィールドへの参照が含まれています。
開く*.BLB
と、ブロック サイズが 64 バイトであることがわかります。テキストのすべてのブロックは、そのサイズまで NULL で埋められます。
私がつまずいているのは、REGARDING 列に格納されている値を BLB ファイル内のブロックの場所に変換しようとしていることです。私の仮定は、6 文字のフィールドがオフセットであるということです。
たとえば、REGARDING の 1 つの値は次のとおりです (角かっこは無視します)。 [ ",J$]
私のグーグルで、私はこれを見つけました: http://ulisse.elettra.trieste.it/services/doc/dbase/DBFstruct.htm#C1.5
メモ フィールド (少なくとも通常の DBF ファイル) では、スペースの値が無視される (つまり、列がパディングされている) ことを説明しています。
したがって、私が正しければ (ここでも、角括弧)[",J$]
が BLB ファイルのオフセットになるはずです。幸いなことに、元の ACT2000 ソフトウェアにまだアクセスできるので、プログラム / MySQL と BLB ファイルの全文を比較できます。
私の例の値を使用すると、REGARDING
値がの DB 行が[ ",J$]
1024 バイトのオフセット (または 64 バイト サイズのブロックであると仮定すると、16 ブロック) に対応することがわかります。
DBF ファイルを読み取るオープン ソース プロジェクトの Python コードをいくつか読み取ろうとしましたが、頭がいっぱいです。
私がする必要があるのは、文字をバイナリに解凍することだと思いますが、よくわかりません。
DBF
ファイルで見つかったものに基づいて、読み取る 64 ブロック ベースのスポットを見つけるにはどうすればよいですか?
ジェリー・ドッジによる編集
このフィールドの文字列を 16 進数値にリバース エンジニアリングしてから、 を使用して整数値に変換しようとしましたStrToInt64
が、結果はまだ BLOB ファイルと一致しません。また、この整数値に 64 を掛けてみましたが、掛け算はしませんでしたが、結果は BLOB ファイルのサイズを超えてしまい、実際にはデータが見つかりませんでした。
たとえば、___/BD
( _
= スペース)の値は$2f4244
16 進数に変換され、これは の整数値に変換され3097156
ますが、64 で乗算または除算しても、BLOB ファイル内のデータの関連部分には対応しません。