2010-12-03 4 views
5

ich eine 5gig csv-Datei (auch als sas Daten-Datei, wenn es einfacher sein würde), die ich brauche, in eine SQL-Datenbank zu setzen, damit ich mit ihm in R. arbeitetUNIX Importieren LARGE csv in SQLite

Die Variablennamen sind alle in der ersten Beobachtungszeile enthalten und werden doppelt zitiert. Es gibt 1000+ Variablen, einige von numerischen anderen Zeichen (obwohl einige der Zeichenvariablen Zeichenketten sind, aber ich mache mir darüber keine Sorgen, ich kann es in R reparieren).

Meine Frage ist, wie kann ich die CSV-Datei in eine neue Tabelle in meiner Datenbank mit minimalen Schmerzen importieren?

Ich habe Dinge gefunden sagen, um Ihre Tabelle zuerst zu erstellen (einschließlich der Angabe aller Variablen, von denen ich 1000+) und dann mit ".import file table", um die Daten zu bringen. Oder, um einige GUI-Import-Assistenten zu verwenden, die für mich keine Option ist.

Sorry, wenn dies sql 101 ist, aber danke für die Hilfe.

+1

Wie viel RAM haben Sie zu arbeiten? –

+0

Wir sind gerade zu einem neuen Forschungscluster gewechselt, also muss ich mich mit dem Administrator nach den Besonderheiten erkundigen, aber ich glaube, dass ich mit den Standardoptionen für die Auftragsübermittlung 16 GB bekomme, und natürlich kann ich bei Bedarf mehr anfordern. –

+0

nur sicher sein, auch die Option zu überprüfen, alles im Speicher zu lassen. Speichern Sie den Arbeitsbereich von Zeit zu Zeit von Ihrem Programm. 16GB ist mehr als genug. Es könnte viel schneller und einfacher sein und Sie haben sogar die Option, bei Bedarf mehr RAM anzufordern. (und Sie laufen LINUX, richtig?) – mrsteve

Antwort

8

Hier ist mein Workflow:

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) 

Die field.types ist nicht erforderlich. RSQLite rät von der Kopfzeile, wenn Sie diese Liste nicht bereitstellen. Der Index ist ebenfalls nicht erforderlich, beschleunigt jedoch später Ihre Abfragen (wenn Sie die richtige Spalte für Ihre Abfragen indizieren).

Ich habe eine Menge von diesem Zeug hier auf SO gelernt, also, wenn Sie meine Fragen auf SQLite geantwortet/beantwortet überprüfen, können Sie einige tagential Sachen finden.

+0

Das sieht gut aus. danke –

+0

+1. Beachten Sie, dass "dbWriteTable" fehlschlägt, wenn Ihre durch Komma getrennte Datei eine andere Erweiterung (manchmal ...) hat. Benenne einfach zu '.csv' um. – Ryogi

4

Schauen Sie sich die Funktion "read.csv.sql" im sqldf-Paket an.

Dies konvertiert eine CSV-Datei in eine SQLite-Datenbank, dann liest es in R, sollten Sie in der Lage sein, die Zwischendatenbank für Ihre Zwecke zu verwenden.

+2

Sie finden ein Beispiel für die Verwendung von sqldf zum Lesen einer CSV-Datei in einer sqlite-Datenbank in Beispiel 13d auf der sqldf-Homepage: http://code.google.com/p/sqldf/#Example_13._read.csv.sql_and_read. csv2.sql –