我有一些财务数据为超过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表示。 –