dbfファイルをsqliteに一括インポートしています。http://dbfpy.sourceforge.net/にあるdbfモジュールを使用して、Pythonで簡単なスクリプトを作成しました。いくつかのケースを除いて、正常に動作し、期待どおりに動作します。非常に目立たない数のケースでは、モジュールが読み取っていたテーブルにいくつかの誤ったレコードを追加したようです。
私はこれが正しく聞こえることを知っていますが、それは本当にそうであるようです。問題のdbaseファイルをopenofficeを使用してcsvにエクスポートし、.importを使用してsqliteに直接インポートしましたが、3つの追加レコードがありません。
しかし、pythonとdbfpyモジュールを使用してファイルを反復処理すると、3つの追加レコードが追加されます。
これらの3つのレコードがdbfファイルで削除済みとしてフラグが立てられ、OpenOfficeには表示されていないときにdbfモジュールによって取得されている可能性があるのではないかと思います。私はこの可能性から遠く離れている可能性がありますが、私は本当にこれに頭を悩ませています。
どんな助けでも大歓迎です。
以下は、dbfファイルを読み取るための私の方法のサンプルです。ループを削除し、代わりに1つのケースを使用しました。
conn = lite.connect('../data/my_dbf.db3')
#used to get rid of the 8 byte string error from sqlite3
conn.text_factory = str
cur = conn.cursor()
rows_list = []
db = dbf.Dbf("../data/test.dbf")
for rec in db:
***if not rec.deleted:***
row_tuple = (rec["name"], rec["address"], rec["age"])
rows_list.append(row_tuple)
print file_name + " processed"
db.close()
cur.executemany("INSERT INTO exported_data VALUES(?, ?, ?)", rows_list)
#pprint.pprint(rows_list)
conn.commit()
解決策 昼食前にさらに30分ほどテストした後、私の考えられる仮説は実際には正しいことがわかりました。一部のファイルはパックされておらず、削除のフラグが付けられたレコードがまだ残っています。エクスポート後に開梱された状態になってはいけないため、混乱が生じました。1つのファイルを手動でパックしてテストしたところ、すぐに適切な結果が返されました。
これについての助けに大いに感謝します。削除されたレコードを無視するために、以下のソリューションを追加しました。このモジュールでこのメソッド(削除済み)を検索して検索しましたが、そのAPIドキュメントが見つかりませんでした。コードも調べましたが、霧の中ですべてがすり抜けたに違いありません。解決策と助けてくれてありがとう。