2010-12-03 62 views
5

我有一個5gig csv文件(也可以作爲一個數據文件的SAS,它是否會更容易些),我需要投入一個SQL數據庫,所以我可以在R.UNIX導入大型CSV到SQLite的

使用它變量名稱全部包含在第一個觀察線中,並用雙引號引起來。有一些數字其他字符有1000多個變量(儘管一些字符變量是數字串,但我並不太擔心它,我可以在R中修復它)。

我的問題是我怎樣才能將csv文件導入到我的數據庫中的一個新表中,而且痛苦最小?

我發現了一些說法,首先創建您的表(其中包括指定所有變量,其中我有1000+),然後使用「.import文件表」來引入數據。 或者,使用一些GUI導入嚮導,這不是我的選擇。

對不起,如果這是SQL 101,但感謝您的幫助。

+1

你需要使用多少RAM? – 2010-12-03 23:20:25

+0

我們只是切換到一個新的研究羣集,所以我將不得不與管理員查詢具體細節,但我相信默認作業提交選項我可以獲得16 GB,當然,我可以根據需要請求更多。 – 2010-12-05 17:31:46

+0

只是一定要檢查在內存中留下一切的選項。不時從您的程序中保存工作區。 16GB是綽綽有餘。可以更快,更容易,並且如果需要,您甚至可以選擇請求更多的RAM。 (並且你正在運行LINUX,對嗎?) – mrsteve 2010-12-05 21:22:00

回答

8

這是我的工作流程:

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) 

field.types是沒有必要的。如果你不提供這個列表,RSQLite會從頭部猜測。該索引也不是必需的,但稍後會加快查詢速度(如果您爲查詢索引正確的列)。

我一直在這裏學習了很多這樣的東西,所以如果你檢查我在SQLite上提出的問題/答案,你可能會發現一些合適的東西。

4

查看sqldf包中的「read.csv.sql」函數。

這將csv文件轉換爲SQLite數據庫,然後將其讀入R,您應該能夠保持中間數據庫的用途爲您的目的。