我正在尝试将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来创建主数据库。
答案 0 :(得分:3)
该问题未提及平台。我无法在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