У меня есть некоторые финансовые данные по более чем 6600 акциям, хранящиеся в базе данных Foxpro. Я мог загрузить представления базы данных в набор из 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, чтобы преобразовать и объединить 12 из 15 файлов в 5 файлов CSV, затем я объединил их с другими оставшимися 3 файлами .txt в Python и Sqlite, чтобы создать базу данных с 8 таблицами (назовем ее CSV). -derived) с использованием модифицированной версии этого кода (с этой страницы):
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 ]))
- Now when I examined both sqlite databases, I found the following:
- The DBF-derived database retained its ID column (although it was not designed as primary key).
- Столбец идентификатора не сохранился при загрузке в .txt в базе данных, полученной из CSV, поэтому я объявил столбец биржевого тикера первичным ключом.
- Полученный из DBF файл не был проиндексирован в sqlite.
- Полученный из CSV файл автоматически индексируется в sqlite.
- Даты сохранили свой формат даты в базе данных, полученной из CSV, тогда как в базе данных, полученной из DBF, они превратились в количество дней.
- Основным типом данных, полученным в процессе вертуализации базы данных, полученной из DBF, был REAL, который я также установил в качестве типа данных при создании базы данных, полученной из CSV.
- Все остальное было идентично, за исключением того, что база данных, полученная из CSV, была на 22% меньше по размеру, чем полученная из DBF, и я озадачен, почему, учитывая, что она проиндексирована и имеет те же данные и тип данных. Две базы данных технически отображают одну и ту же информацию в программе DB Browser.
Любое объяснение, почему разница в размере? Это из-за 3 файлов .txt, которые я не конвертировал в CSV?