2017-04-22 119 views
0

我有一些財務數據爲超過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文件?

回答

1

很難理解你在做什麼,特別是當你可以直接從另一個數據庫系統獲取數據時,爲什麼你會想要在兩者之間使用CSV。無論如何,這是您的選擇,差異可能在於VFP DBF數據與字符字段具有尾隨空格。說一個30個字符的字段,其中單個字母的長度仍然爲30個。您轉換爲SQLite可能不會裁剪尾部空格,而在CSV文件中,這些數據已經以修剪方式保存。 也許最簡單也是最可靠的方法是直接創建SQLite表並使用VFP程序中的數據填充它們(使用VFP當然不是必須的,可以用任何語言來完成)。

+0

謝謝切廷。這有助於瞭解,但我似乎無法在DP瀏覽器中仔細檢查DBF源char字段的任何尾隨空格。 至於爲什麼要使用CSV路線,我下載數據的程序只允許保存DBF或CSV。它沒有設施可以直接保存在SQLite中。因此,在將文件轉換爲SQLite之前,我必須首先使用任一格式,到目前爲止,CSV路由似乎更有效。 –

+0

使用CSV的IMHO數據傳輸很容易出錯。只要有機會,我會使用數據庫到數據庫的傳輸。在你的情況下,DBF是一個更好的選擇恕我直言。 –

+0

再次謝謝切廷。奇怪的是,我發現使用DBF產生了不準確的結果。 DBF路由返回的日期爲天數(從某個日期開始),其中一些日期奇怪地被替換爲NULL,而所有日期完全從CSV傳輸中倖存下來,並以MM/DD/YYYY表示。 –

相關問題