2017-04-22 124 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表示。 –

相关问题