R:来自sqldf的read.csv.sql能够成功读取一个csv但不能读取另一个csv

时间:2015-04-04 07:01:15

标签: r csv

我有一个大约20GB的数据集,因此,我无法将其读入R数据帧而不会耗尽内存。在这里阅读了一些帖子后,我决定将read.csv.sql用于数据库。我使用的代码是:

  

read.csv.sql(“jobs.csv”,sql =“CREATE TABLE Jobs2 AS SELECT * FROM file”,dbname =“Test1.sqlite”)

当我运行以下内容时:

  

sqldf(“select * from Jobs2”,dbname =“Test1.sqlite”)

我得到了列的标题,但后来没有值: < 0行> (或0长度的row.names)

但是当我使用虹膜数据集创建的csv尝试相同时,一切正常。

我在这里缺少什么?

提前致谢。

1 个答案:

答案 0 :(得分:6)

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字符。例如,如果您尝试读取在另一个操作系统中的一个操作系统上创建的文件,则可能需要指定它。请参阅常见问题解答11.为什么我在使用SQLite in the sqldf README阅读数据文件时遇到困难。

注意: read.csv.sql通常用于读取部分数据。例如,这会跳过前100行,然后从接下来的1000行读取列ab,但查询可能是任意复杂的,因为您要使用所有SQLite的SQL:

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

整个文件被读入一个临时的sqlite数据库,但只有被请求的部分被读入R,所以整个文件可能比R可以处理的大。

通常,如果一个人试图实现持久性,则直接使用RSQLite而不是sqldf。