2010-12-03 34 views
5

J'ai un fichier csv 5gig (également comme sas datafile, s'il serait plus facile) que je dois mettre dans une base de données SQL pour que je puisse travailler avec elle dans l'affaire R.UNIX Importation GRAND csv dans SQLite

Les noms des variables sont tous contenus dans la première ligne d'observation et sont en double guillemets. Il y a plus de 1000 variables parmi les autres caractères numériques (bien que certaines des variables de caractères soient des chaînes de chiffres, mais je ne suis pas trop inquiet à ce sujet je peux le corriger en R).

Ma question est comment puis-je importer le fichier csv dans une nouvelle table dans ma base de données avec un minimum de douleur?

J'ai trouvé des choses disant de créer votre table d'abord (qui comprend la spécification de toutes les variables, dont j'ai plus de 1000) et ensuite en utilisant ". Import file table" pour apporter les données. Ou, pour utiliser un assistant d'importation gui, ce qui n'est pas une option pour moi. Désolé si c'est sql 101 mais merci pour l'aide.

+1

De combien de RAM avez-vous besoin? –

+0

Nous venons de passer à un nouveau groupe de recherche, je vais devoir vérifier avec l'administrateur sur les détails mais je crois qu'avec les options de soumission de travail par défaut, je reçois 16 Go, et bien sûr je peux en demander plus. –

+0

Assurez-vous simplement de vérifier également l'option de tout laisser en mémoire. enregistrer l'espace de travail de temps en temps à partir de votre programme. 16 Go est plus que suffisant. Pourrait être beaucoup plus rapide et plus facile, et vous avez même la possibilité de demander plus de RAM si nécessaire de votre opérateur. (et vous utilisez LINUX, n'est-ce pas?) – mrsteve

Répondre

8

Voici mon flux de travail:

library("RSQLite") 
setwd("~/your/dir") 
db <- dbConnect(SQLite(), dbname="your_db.sqlite") ## will make, if not present 
field.types <- list(
     date="INTEGER", 
     symbol="TEXT", 
     permno="INTEGER", 
     shrcd="INTEGER", 
     prc="REAL", 
     ret="REAL") 
dbWriteTable(conn=db, name="your_table", value="your_file.csv", row.names=FALSE, header=TRUE, field.types=field.types) 
dbGetQuery(db, "CREATE INDEX IF NOT EXISTS idx_your_table_date_sym ON crsp (date, symbol)") 
dbDisconnect(db) 

Le field.types n'est pas nécessaire. RSQLite devinera à partir de l'en-tête si vous ne fournissez pas cette liste. L'index n'est pas requis non plus, mais accélérera vos requêtes plus tard (si vous indexez la colonne correcte pour vos requêtes).

J'ai appris beaucoup de ces choses ici sur SO, donc si vous vérifiez mes questions posées/répondues sur SQLite, vous pouvez trouver des choses essentielles.

+0

Cela a l'air génial. merci –

+0

+1. Notez que si votre fichier séparé par des virgules a une extension différente (parfois ...), 'dbWriteTable' échouera. Renommez simplement '.csv'. – Ryogi

4

Regardez la fonction "read.csv.sql" dans le paquet sqldf.

Cela convertit un fichier CSV dans une base de données SQLite, puis le lit dans R, vous devriez être en mesure de garder la base de données intermédiaire à utiliser pour vos besoins.

+2

Vous pouvez trouver un exemple d'utilisation de sqldf pour lire un fichier csv dans une base de données sqlite dans l'exemple 13d de la page d'accueil de sqldf: http://code.google.com/p/sqldf/#Example_13._read.csv.sql_and_read. csv2.sql –