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

时间:2019-04-22 08:15:56

标签: r sqldf

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

尝试一些简单的代码后,我的所有SQL查询都没有返回有效结果-所有查询都将返回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来创建主数据库。

1 个答案:

答案 0 :(得分:3)

该问题未提及平台。我无法在Linux上重现此问题,但可以在Windows上重现此问题。 Windows上的问题是行尾。 write_csv\n写为行尾,但read.csv.sql默认为运行平台上的常规行尾-在Windows上,常规行尾为\r\nwrite.csvread.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