2015-04-04 25 views
5

我有一個大約20GB的數據集,因此,我無法將其讀入R數據框而不會耗盡內存。在閱讀一些帖子後,我決定將read.csv.sql用於數據庫。我所使用的代碼是:R:來自sqldf的read.csv.sql能夠成功讀取一個csv,但不能讀取另一個csv

read.csv.sql( 「jobs.csv」,SQL = 「CREATE TABLE Jobs2 AS SELECT * FROM文件」,則dbname = 「Test1.sqlite」)

當我運行以下命令:

sqldf( 「SELECT * FROM Jobs2」,數據庫名= 「Test1.sqlite」)

我得到的列的標題,但後來沒有價值: < 0行>(或0長度row.names)

但是,當我嘗試使用虹膜數據集創建的csv相同,一切工作正常。

我在這裏錯過了什麼?

在此先感謝。

回答

5

sqldf主要用於處理數據幀,以便透明地創建數據庫和數據庫表,並在完成sql後刪除它們。因此,由於sqldf會在語句完成後刪除數據庫,因此您的第一條語句不會有效。

如果SQL創建數據庫或表而不是sqldf本身,那麼sqldf不會知道它,所以它不會刪除它。這裏我們使用attach和使用create table的表來創建數據庫來愚弄sqldf。在最後一行也不會刪除數據庫表OIR,因爲他們已經在那裏之前該行開始,它永遠不會刪除對象沒有創建:

library(sqldf) 

read.csv.sql("jobs.csv", sql = c("attach 'test1.sqlite' as new", 
       "create table new.jobs2 as select * from file")) 
sqldf("select * from jobs2", dbname = "test1.sqlite") 

可能出問題將行結束的另一件事。通常情況下,sqldf可以計算出來,但如果不是,則可能需要指定eol字符。例如,如果您嘗試讀取在另一個操作系統中的一個操作系統上創建的文件,則可能需要指定它。請參閱FAQ 11.爲什麼我無法使用SQLitein the sqldf README讀取數據文件。

注:read.csv.sql通常用於只讀取部分數據。例如,這將跳過第100行,然後讀取列a,並從下一個1000行b但既然你把所有的SQLite的SQL中使用查詢可以是任意複雜:

read.csv.sql("jobs.csv", sql = "select a, b from file limit 1000 offset 100") 

將整個文件讀到一個臨時的sqlite數據庫,但只有被請求的部分被讀入R,因此整個文件可能比R可以處理的大。

通常,如果有人試圖實現持久性,那麼直接使用RSQLite而不是sqldf。

+0

感謝G.格洛騰迪克,我設法找到了解決方案。原來,這是行字符的結尾。因此,通過將 eol =「\ n」添加到我的read.csv.sql中,它工作正常。 謝謝你的所有輸入。 – user3259937 2015-04-14 01:40:19