1

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ドキュメントが見つかりませんでした。コードも調べましたが、霧の中ですべてがすり抜けたに違いありません。解決策と助けてくれてありがとう。

4

1 に答える 1

1

削除済みとしてマークされたレコードを破棄したくない場合は、次のように記述できます。

for rec in db:
    if not rec.deleted:
        row_tuple = (rec["name"], rec["address"], rec["age"])
        rows_list.append(row_tuple)
于 2012-11-15T13:29:14.953 に答える