【问题标题】:Read .sql into R with Spanish characters (á, é, í, ó, ú, ñ, etc)使用西班牙语字符(á、é、í、ó、ú、ñ 等)将 .sql 读入 R
【发布时间】:2020-04-13 23:45:28
【问题描述】:

所以,我已经为此苦苦挣扎了一段时间,似乎无法通过谷歌搜索。我正在尝试将 .sql 文件读入 R,我总是这样做是为了避免在我的 R 脚本中放入 100 多行 sql。我通常这样做:

library(tidyverse)
library(DBI)

con <- dbConnect(<CONNECTION ARGUMENTS>)

query <- read_file("path/to/script.sql")
df <- as_tibble(dbGetQuery(con, query))

dbDisconnect(con)

但是,这次我的 sql 脚本中有一些西班牙字符。说这样的话:

select tree_id, tree
from forest.trees
where species = 'árbol'

当我将此脚本读入 R 并进行查询时,它不会返回任何内容,但如果我将 sql 脚本复制并粘贴到 R 字符串中,它就可以工作!所以看起来问题出在我将脚本读入 R 的那一行。

我尝试通过几种方式更改字符串的编码:

# none of these work
query <- read_file("path/to/script.sql")
Encoding(query) <- "latin1"

query <- readLines("path/to/script.sql", encoding = "latin1")
query <- paste0(query, collapse = " ")

很遗憾,我没有公共数据库可供阅读本文的任何人使用。我正在连接到 postgreSQL 11 数据库。

--- 更新 ----

我在使用美国语言环境的 Windows 10 机器上。

当我使用read_file 函数时,query 的内容看起来不错,西班牙文字符按应有的方式打印出来,但是当我将它传递给 dbGetQuery 时,它什么也得不到。

我尝试强制编码“latin1”,因为我在网上发现西班牙字符在这样做时往往会在 R 中修复。执行此操作时,西班牙字符打印错误,所以我没想到它会起作用,但它没有。

我的数据库中的字符值具有 'utf-8' 编码。

为了完全清楚,我阅读 .sql 脚本的所有尝试都没有奏效,但这确实有效:

library(tidyverse)
library(DBI)

con <- dbConnect(<CONNECTION ARGUMENTS>)

query <- "select tree_id, tree from forest.trees where species = 'árbol'"
# df actually has results
df <- as_tibble(dbGetQuery(con, query))

dbDisconnect(con)

【问题讨论】:

  • 您在包含非 ASCII 字符的文件上使用了什么编码?你确定它是 latin-1 吗?你在 Windows 上吗? query 的内容看起来正确吗?您的数据库中的字符值是如何编码的?
  • @MrFlick 我用所有信息更新了问题,感谢您的帮助!
  • 好吧,如果你从有效的块中取出query,然后执行write_lines(query, "test.sql"),然后将其读回并使用query &lt;- read_lines("test.sql"); dbGetQuery(con, query) 运行它,它是否有效?在 Windows 上,默认情况下一切都是 latin-1。您可能需要转换为 utf-8 才能使用数据库连接。在您尝试将其设置为“latin-1”之前,Encoding(query) 会返回什么。
  • @MrFlick 我实际上已经尝试过了,但它没有用,我没有将它发布为我尝试过的东西,因为当我写这个问题时它听起来很愚蠢:P
  • Encoding(query) 返回“UTF-8”

标签: r postgresql character-encoding odbc


【解决方案1】:

编码语句告诉 R 如何解释文件名,而不是其内容。试试这个:

filetext <- readLines(file("path/to/script.sql", encoding = "latin1"))

查看这个答案了解更多详情:R: can't read unicode text files even when specifying the encoding

【讨论】:

  • 那也没用,dbGetQuery 不返回任何东西:/ 你所指的问题只涉及将字符读入 R,我使用 @ 没有问题987654324@。问题是当我尝试将该字符串作为查询发送时。
【解决方案2】:

所以经过一段时间的思考,我想知道为什么 MrFlick 提出的解决方案不起作用。我检查了这个块创建的文件的编码:

query <- "select tree_id, tree from forest.trees where species = 'árbol'"
write_lines(query, "test.sql")

检查了test.sql的编码是什么,原来是ANSI,但是看起来不太对。所以我手动将我原来的 script.sql 编码更改为 ANSI。之后它就完全正常了。

但是,当我在 ubuntu 环境中克隆我的存储库时,此解决方案不起作用。在 ubuntu 中,原来的 'utf-8' 编码没有问题。

希望这对任何在 Windows 中处理此问题的人有所帮助。

【讨论】:

    猜你喜欢
    • 2014-11-30
    • 2012-07-14
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 2014-12-27
    • 2019-09-26
    相关资源
    最近更新 更多