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