2017-04-22 3 views
0

私は、Foxproデータベースに保存されている6600株以上の財務データを持っています。データベースビューを15個のファイルのセットにダウンロードできます。最初は.dbfファイルに、次に.txtファイル(カンマ区切り)にしました。2つの同じデータSQLiteデータベースのサイズが異なるのはなぜですか?

.dbfファイルの場合、PythonとSqliteでspatialite仮想化拡張を使用して、それらをSqliteテーブルに変換し、8テーブルのデータベースにマージしました(DBF派生と呼ぶ)。だから、カーソルのCで:.txtファイルの場合

c.execute("CREATE VIRTUAL TABLE temp_virt USING VirtualDbf({}, UTF-8)".format(file)) 
c.execute("CREATE TABLE {} AS SELECT * FROM temp_virt;".format(table_name)) 

、私は変換して5つのCSVファイルに15個のファイルの12を結合するためにパンダを使用し、その後、私はPythonで残りの3つの.txtファイルでそれらをプライし、 8テーブルのデータベースを作成するためのSQLiteは(のは、CSV由来のそれを呼びましょう)(このpageから)このコードの修正バージョン使用して:私は両方のsqliteのデータベースを調査したときに今

with open(csvfile, "rb") as f: 
    reader = csv.reader(f) 
    header = True 
    for row in reader: 
     if header: 
      # gather column names from the first row of the csv 
      header = False 

      sql = "DROP TABLE IF EXISTS %s" % tablename 
      c.execute(sql) 
      sql = "CREATE TABLE %s (%s)" % (tablename, 
         ", ".join([ "%s text" % column for column in row ])) 
      c.execute(sql) 

      for column in row: 
       if column.lower().endswith("_id"): 
        index = "%s__%s" % (tablename, column) 
        sql = "CREATE INDEX %s on %s (%s)" % (index, tablename, column) 
        c.execute(sql) 

      insertsql = "INSERT INTO %s VALUES (%s)" % (tablename, 
         ", ".join([ "?" for column in row ])) 
  • を、私は次を発見しました:
    • DBF由来データベースはID列を保持していました(プライマリキーとして設計されていませんでしたが)。
    • ID列は、CSV由来のdbでダウンロードしても存続しませんでしたので、私は株式ティッカー列を主キーとして宣言しました。
    • DBF由来のものは、sqliteでは索引付けされていません。
    • CSV-derivedはsqliteで自動インデックスを取得しました。
    • 日付はCSV由来のデータベースで日付形式を保持していましたが、DBF由来のdbでは数日になりました。
    • DBF由来のデータベースの頂点化プロセスで発生した主なデータ型はREALで、これはCSV由来のDBを作成したため、データ型としても設定されています。
    • CSV由来のdbのサイズがDBFのサイズより22%小さいことを除いて、他の点は同じですが、 が同じデータとデータ型を持っていると考えると、私は困惑しています。 2つのデータベースは技術的に同じ情報をDB ブラウザプログラムに表示します。サイズは、なぜ違いになど

どれ説明?それは私がCSVに変換しなかった3つの.txtファイルのためですか?

答えて

1

あなたが何をしているのか、特に他のデータベースシステムから直接データを取得できるときに、いつまでにCSVを使用するのかを理解するのは難しいです。とにかく、それはあなたの選択ですが、違いはおそらく、文字フィールドを持つVFP DBFデータの末尾に空白があることです。 30文字の文字列を1文字とすると、長さは30になります。SQLiteへの変換では末尾の空白がトリミングされないことがありますが、CSVファイルではこれらのデータは既にトリミングされて保存されています。 最も簡単で信頼性の高い方法は、SQLiteテーブルを直接作成し、VFPプログラム内からデータを入力することです(VFPを使用することはもちろん、どの言語でも可能です)。

+0

ありがとうございました。これは知っておくと便利ですが、DP BrowserのDBFソースのcharフィールドを詳しく調べると、末尾に空白がないようです。 CSVルートに行く理由は、データをダウンロードするプログラムによってDBFまたはCSVでのみ保存が可能です。 SQLiteに直接保存する機能はありません。だから私はファイルをSQLiteに変換する前にどちらかのフォーマットを使用しなければなりません。そして今までのCSVの方が効率的です。 –

+0

CSVを使用したIMHOデータ転送でエラーが発生する可能性があります。チャンスがあるときはいつでも、データベースをデータベース転送に使用します。あなたのケースでは、DBFはより良い選択IMHOです。 –

+0

再びありがとうございました。不思議なことに、私はDBFを使用すると不正確さが生じることを発見しました。 DBFルートは日付を(特定の日付から)日数として返し、いくつかの日付は奇妙にNULLに置き換えられましたが、すべての日付はCSV転送から完全に生き残り、MM/DD/YYYYとして表されます。 –

関連する問題