2010-12-03 15 views
5

Tengo un archivo csv 5gig (también como archivo de datos SAS, si sería más fácil), que tengo que poner en una base de datos SQL para poder trabajar con él en R.UNIX Importar CSV grande en SQLite

Los nombres de las variables están todos contenidos en la primera línea de observación y están doblemente citados. Hay más de 1000 variables, algunas de carácter numérico de los demás (aunque algunas de las variables de caracteres son cadenas de números, pero no estoy demasiado preocupado, puedo arreglarlo en R).

Mi pregunta es ¿cómo puedo importar el archivo csv en una nueva tabla en mi base de datos con un mínimo de dolor?

He encontrado cosas que dicen que primero debe crear su tabla (que incluye especificar todas las variables, de las cuales tengo 1000+) y luego usar ".import file table" para traer los datos. O, para usar algún asistente de importación de GUI, que no es una opción para mí.

Lo siento si esto es sql 101 pero gracias por la ayuda.

+1

¿Cuánta RAM tiene que trabajar? –

+0

Acabamos de cambiar a un nuevo grupo de investigación, así que tendré que consultar con el administrador sobre los detalles, pero creo que con las opciones predeterminadas de envío de trabajos recibo 16 GB, y por supuesto puedo solicitar más según sea necesario. –

+0

solo asegúrese de verificar también la opción de dejar todo en la memoria. guarde el espacio de trabajo de vez en cuando desde su programa. 16 GB es más que suficiente. Podría ser mucho más rápido y más fácil, e incluso tiene la opción de solicitar más RAM si lo necesita su operador. (y está ejecutando LINUX, ¿verdad?) – mrsteve

Respuesta

8

Aquí está mi flujo de trabajo:

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) 

El field.types no es necesario. RSQLite adivinará desde el encabezado si no proporciona esta lista. El índice tampoco es obligatorio, pero acelerará sus consultas más adelante (si indiza la columna correcta para sus consultas).

He estado aprendiendo mucho de esto aquí en SO, así que si revisas mis preguntas formuladas/respondidas en SQLite, es posible que encuentres algunas cosas importantes.

+0

Esto se ve genial. gracias –

+0

+1. Tenga en cuenta que si su archivo separado por comas tiene una extensión diferente (a veces ...), 'dbWriteTable' fallará. Simplemente cambie el nombre a '.csv'. – Ryogi

4

Mire la función "read.csv.sql" en el paquete sqldf.

Esto convierte un archivo csv en una base de datos SQLite, luego lo lee en R, debería ser capaz de mantener la base de datos intermedia para usarla para sus propósitos.

+2

Puede encontrar un ejemplo del uso de sqldf para leer un archivo csv en una base de datos sqlite en el ejemplo 13d en la página de inicio sqldf: http://code.google.com/p/sqldf/#Example_13._read.csv.sql_and_read. csv2.sql –

Cuestiones relacionadas