【问题标题】:R sqldf not recognizing source csv file made with "write_csv"R sqldf 无法识别使用“write_csv”制作的源 csv 文件
【发布时间】:2019-09-11 11:05:15
【问题描述】:

我正在尝试将 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 来创建主数据库。

【问题讨论】:

  • 我认为问题在于 CSV 编码格式。根据write_csv 手册,输出(iris2)应编码为UTF-8(如write.csvfor iris1),但我怀疑它是CSV-Macintosh,这不是read.csv.sql 的最佳选择。

标签: r sqldf


【解决方案1】:

问题没有提到平台。我无法在 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

【讨论】:

  • 我绝对忘了提到平台。我在 Windows 上,eol 参数绝对是我问题的关键。谢谢!
猜你喜欢
  • 2017-03-12
  • 2013-06-05
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多