R sqldf 无法识别使用 "write_csv" 制作的源 csv 文件

R sqldf not recognizing source csv file made with "write_csv"

我正在尝试将 sqldf 用于我的大型数据集。 (原始数据文件分散在 1000~ 个单独的 csv 文件中,因此我创建了一个包含所有这些信息的主 csv 文件,并计划使用 sqldf 根据需要获取数据)

尝试一些简单的代码后,我的 sql 查询中的 none return 得到了有效结果——所有查询都将 return 0 次观察!

我尝试 运行 "read.csv.sql" 文档中提供的示例代码,它创建了一个带有鸢尾花数据集的 csv 文件和 运行 一个简单的 sql 查询来获取来自创建的 csv 文件的数据。我已经完成了两个不同的版本:

write.csv(iris, "iris1.csv", quote = FALSE, row.names = FALSE)
iris1 <- read.csv.sql("iris1.csv", 
                      sql = "select * from file where Species = 'setosa' ")
dim(iris1)
write_csv(iris, "iris2.csv")
iris2 <- read.csv.sql("iris2.csv", 
                      sql = "select * from file where Species = 'setosa' ")
dim(iris2)

我得到以下信息:

> dim(iris1)
[1] 50  5
> dim(iris2)
[1] 0 5

我发现的唯一区别是 "iris1.csv" 是用 write.csv 制作的,而 "iris2.csv" 是用 write_csv 制作的。对我来说,它们似乎是完全相同的 csv 文件。导致这种意想不到的结果的根本区别是什么?我只会使用 write.csv,但我的数据集太大,我肯定需要使用 write_csv 来创建主数据库。

问题没有提到平台。我无法在 Linux 上重现此问题,但可以在 Windows 上重现该问题。 Windows 上的问题是行尾。 write_csv\n 写为行结尾,但 read.csv.sql 默认为它所在平台上的通常行结尾 运行 -- 在 Windows 上通常的行结尾是 \r\nwrite.csvread.csv.sql 都有一个 eol 参数,允许指定行尾字符,但 write_csv 没有(参见 readr issue #857)所以尝试在 read.csv.sql 中指定 eol = "\n",如下所示:

write_csv(iris, "iris2.csv")

iris2a <- read.csv.sql("iris2.csv", 
  sql = "select * from file where Species = 'setosa' ", eol = "\n")

dim(iris2a)
## [1] 50  5