我有一些存储在FOXPRO数据库中的超过6600个股票的财务数据。我可以将数据库视图下载到一组15个文件中,然后将其首先放入.dbf文件中,然后将其放入.txt文件(逗号删除(中。
对于.dbf组的文件集,我使用了带有python和sqlite的空间虚拟化扩展名将它们转换为sqlite表,然后将它们合并到8台数据库中(我们称其为DBF衍生(。因此,使用C用于光标:
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文件,我使用pandas将15个文件中的12个中的12个转换为5 csv文件,然后我将它们与其他剩余的3个.txt文件一起使用Python和sqlite中,以创建一个8台的数据库(让我们使用此代码的修改版本(来自此页面(称其为CSV衍生(:
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衍生的DB中下载到.txt,因此我将股票股票列宣布为主要键。
- dbf衍生的sqlite未索引。
- CSV衍生的SQLite自动索引。
- 日期将其日期格式保留在CSV衍生的DB中,而它们变成了DBF衍生的DB的几天。
- 通过DBF衍生的DB的Vertualization过程产生的主要数据类型是真实的,我也将其设置为数据类型创建了CSV衍生的DB。
- 其他所有内容都是相同的,除了CSV衍生的DB的大小比DBF衍生的大小22%,而我为何感到困惑考虑到索引并具有相同的数据和数据类型。这两个数据库在技术上在数据库中显示相同的信息浏览器程序。
关于为什么大小差异的任何解释?是因为我没有转换为CSV的3个.txt文件?
很难理解您在做什么,尤其是为什么您想直接从另一个数据库系统获取数据时都希望在两者之间使用CSV。无论如何,这是您的选择,差异可能是因为VFP DBF数据带有字符字段具有落后空间。假设一个30个字符的字段,其中有一个字母的长度仍为30。您的转换为sqlite可能不会修剪尾随的空间,而在CSV文件中,这些数据已被修剪为修剪。可能是最简单,最可靠的方法是直接创建SQLITE表,并在VFP程序中填写数据(当然,使用VFP并不是必需的,可以用任何语言来完成(。