使用西班牙字符(á、é、í、ó、ú、ñ 等)将 .sql 读入 R
Read .sql into R with Spanish characters (á, é, í, ó, ú, ñ, etc)
所以,我已经为此苦苦挣扎了一段时间,似乎无法 google 摆脱它。我正在尝试将 .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 并进行查询时,它 return 什么也没有,但是如果我将 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 = " ")
不幸的是,我没有 public 数据库可以提供给阅读本文的任何人。我正在连接到 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)
编码语句告诉 R 如何解释文件名,而不是它的内容。试试这个:
filetext <- readLines(file("path/to/script.sql", encoding = "latin1"))
有关详细信息,请参阅此答案:R: can't read unicode text files even when specifying the encoding
所以经过一段时间的思考,我想知道为什么 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 中处理此问题的任何人有所帮助。
所以,我已经为此苦苦挣扎了一段时间,似乎无法 google 摆脱它。我正在尝试将 .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 并进行查询时,它 return 什么也没有,但是如果我将 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 = " ")
不幸的是,我没有 public 数据库可以提供给阅读本文的任何人。我正在连接到 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)
编码语句告诉 R 如何解释文件名,而不是它的内容。试试这个:
filetext <- readLines(file("path/to/script.sql", encoding = "latin1"))
有关详细信息,请参阅此答案:R: can't read unicode text files even when specifying the encoding
所以经过一段时间的思考,我想知道为什么 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 中处理此问题的任何人有所帮助。