我有一些財務數據爲超過6600存儲在Foxpro數據庫中的股票。我可以將數據庫視圖下載到一組15個文件中,我首先將它們放入.dbf文件,然後放入.txt文件(以逗號分隔)。爲什麼兩個同一數據SQLite數據庫有不同的大小?
對於.dbf文件集,我用Python和Sqlite將Spatialite虛擬化擴展轉換成Sqlite表,然後將它們合併到一個8表數據庫中(我們稱它爲DBF派生的)。因此,與下光標:
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))
對於.txt文件,我用熊貓轉換和合並的15個文件的12進5個的CSV文件,然後我跟其他剩餘的3個.txt文件合股他們在Python和SQLite的創建8表數據庫(姑且稱之爲CSV衍生)使用此代碼的修改版本(從這個page):
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 ]))
- 現在,當我在研究這兩個SQLite數據庫,我發現了以下:
- DBF派生的數據庫保留其ID列(儘管它不是作爲主鍵設計的)。
- ID列無法在CSV衍生分貝下載到.txt,所以我宣佈股票行情欄作爲主鍵。
- 源自DBF的未在sqlite中編入索引。
- CSV導出得到自動索引在sqlite中。
- 日期在CSV導出的數據庫中保留了日期格式,而在DBF派生的數據庫中日期格式變爲天數。
- 通過DBF派生數據庫的虛擬化過程得出的主要數據類型是REAL,我也將其設置爲數據類型,因爲我創建了CSV派生的數據庫。
- 除了CSV導出的數據庫比DBF派生的數據庫的大小小22%之外,其他所有內容都是相同的,我對於爲什麼 考慮到索引並具有相同的數據和數據類型而感到困惑。 這兩個數據庫在技術上在DB 瀏覽器程序中顯示相同的信息。
任何解釋以擴大規模,爲什麼不同?是否因爲我沒有轉換爲CSV的3個.txt文件?
謝謝切廷。這有助於瞭解,但我似乎無法在DP瀏覽器中仔細檢查DBF源char字段的任何尾隨空格。 至於爲什麼要使用CSV路線,我下載數據的程序只允許保存DBF或CSV。它沒有設施可以直接保存在SQLite中。因此,在將文件轉換爲SQLite之前,我必須首先使用任一格式,到目前爲止,CSV路由似乎更有效。 –
使用CSV的IMHO數據傳輸很容易出錯。只要有機會,我會使用數據庫到數據庫的傳輸。在你的情況下,DBF是一個更好的選擇恕我直言。 –
再次謝謝切廷。奇怪的是,我發現使用DBF產生了不準確的結果。 DBF路由返回的日期爲天數(從某個日期開始),其中一些日期奇怪地被替換爲NULL,而所有日期完全從CSV傳輸中倖存下來,並以MM/DD/YYYY表示。 –