2017-04-22 1 views
0

J'ai des données financières pour plus de 6600 stocks stockés dans une base de données Foxpro. Je pourrais télécharger les vues de la base de données dans un ensemble de 15 fichiers, que j'ai d'abord fait dans des fichiers .dbf puis dans des fichiers .txt (délimités par des virgules). Pour l'ensemble de fichiers .dbf, j'ai utilisé une extension de virtualisation spatialite avec Python et Sqlite pour les convertir en tables Sqlite puis les ai fusionnées en une base de données à 8 tables (appelons-la DBF-derived). Donc, avec c pour le curseur:Pourquoi deux bases de données SQLite de même données ont des tailles différentes?

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)) 

Pour les fichiers txt, je Pandas pour convertir et combiner 12 des 15 fichiers dans 5 fichiers CSV, puis je les retordus avec 3 autres fichiers txt restant en Python et SQLite pour créer une base de données 8 table (appelons-le CSV dérivé) en utilisant une version modifiée de ce code (de cette 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 ])) 
  • maintenant, quand j'examiné les deux bases de données SQLite, j'ai trouvé ce qui suit :
    • La base de données dérivée DBF a conservé sa colonne ID (bien qu'elle n'ait pas été conçue comme clé primaire).
    • La colonne ID n'a pas survécu au téléchargement Txt dans la base de dérivés CSV donc je déclarai la colonne ticker comme clé primaire.
    • Le dérivé DBF n'a pas été indexé dans sqlite.
    • Le dérivé CSV a obtenu l'indexation automatique en sqlite.
    • Dates conservé leur format de date dans la base de dérivés CSV, alors qu'ils se sont en un certain nombre de jours dans le db dérivé DBF.
    • Le principal type de données fourni par le processus de vertualization pour le db dérivé DBF-REAL est que je mets également le type de données que je créé le db dérivé CSV. Tout le reste était identique, sauf que le db dérivé de CSV était 22% plus petit en taille que le dérivé DBF, et je suis déconcerté pourquoi considérant qu'il est indexé et a les mêmes données et le même type de données. Les deux bases de données affichent techniquement les mêmes informations dans le programme de navigateur DB .

Toute explication à la différence de taille? Est-ce à cause des 3 fichiers .txt que je n'ai pas convertis en CSV?

Répondre

1

Il est difficile de comprendre ce que vous faites et surtout pourquoi vous voulez jamais utiliser un fichier CSV entre quand vous pouvez directement obtenir des données d'un autre système de base de données. Quoi qu'il en soit, c'est votre choix, la différence est probablement due au fait que les données DBF VFP avec champs de caractères ont des espaces de fin. Supposons qu'un champ de 30 caractères ait une longueur de 30. Votre conversion vers SQLite ne supprime peut-être pas les espaces de fin, tandis que dans un fichier CSV, ces données sont déjà sauvegardées comme étant tronquées. Probablement le moyen le plus simple et le plus fiable serait de créer directement les tables SQLite et de les remplir avec des données provenant d'un programme VFP (l'utilisation de VFP n'est pas obligatoire, cela peut être fait dans n'importe quelle langue).

+0

Merci Cetin. Cela est utile à savoir, mais je n'arrive pas à trouver d'espaces de fin en examinant de près les champs de caractères DBF dans le navigateur DP. Quant à savoir pourquoi aller sur la route CSV, le programme à partir duquel je télécharge les données permet d'enregistrer uniquement en DBF ou CSV. Il n'a pas la possibilité de sauvegarder directement dans SQLite.Je dois donc utiliser l'un ou l'autre format avant de convertir les fichiers en SQLite, et jusqu'à présent, la route CSV semble plus efficace. –

+0

Les transferts de données à mon humble avis utilisant le format CSV sont sujets à des erreurs. Chaque fois qu'il y a une chance, j'utiliserais la base de données pour le transfert de base de données. Dans votre cas, DBF est un meilleur choix à mon humble avis. –

+0

Merci encore Cetin. Étrangement, j'ai trouvé que l'utilisation de DBF a produit des inexactitudes. La route DBF renvoie les dates en nombre de jours (à partir d'une certaine date) et certaines de ces dates ont étrangement été remplacées par NULL, alors que toutes les dates ont entièrement survécu au transfert CSV et sont représentées comme MM/JJ/AAAA. –