我正在尝试将sqldf用于我的大型数据集。 (原始数据文件分散在1000个单独的csv文件中,因此我创建了一个包含所有这些信息的主csv文件,并计划使用sqldf根据需要获取数据)
尝试一些简单的代码后,我的sql查询都没有返回有效的结果 - 所有查询都会返回0个观察结果!
我尝试运行“read.csv.sql”文档中提供的示例代码,该文档创建了一个带有iris数据集的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\n
。 write.csv
和read.csv.sql
都有一个eol
参数,允许一个人指定行尾字符,但write_csv
没有(参见readr issue #857)所以尝试在eol = "\n"
中指定read.csv.sql
,如下所示:
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