Прочитайте. sql в R с символами Spani sh (á, é, í, ó, ú, ñ, et c) - PullRequest
0 голосов
/ 14 апреля 2020

Итак, я некоторое время боролся с этим и, похоже, не могу найти выход из ситуации. Я пытаюсь прочитать файл. sql в R, я всегда так делаю, чтобы не вставлять более 100 строк sql в мои R-скрипты. Обычно я делаю это:

library(tidyverse)
library(DBI)

con <- dbConnect(<CONNECTION ARGUMENTS>)

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

dbDisconnect(con)

Однако на этот раз в моем скрипте sql есть несколько символов Spani sh. Скажите что-то вроде этого:

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 = " ")

К сожалению, у меня нет базы данных publi c, чтобы предложить кому-либо, кто читает это. Я подключаюсь к базе данных postgreSQL 11.

--- ОБНОВЛЕНИЕ ----

Я на машине windows 10, с американским языком.

Когда я использую функцию read_file, содержимое query выглядит нормально, символы Spani sh распечатываются так, как должны, но когда я передаю его в dbGetQuery, оно просто ничего не получает.

Я попытался принудительно применить кодировку "latin1", потому что я обнаружил в сети, что символы Spani sh обычно исправляются в R при этом. При этом символы Spani sh печатаются неправильно, поэтому я не ожидал, что это сработает, и это не так.

Значения символов в моей базе данных имеют кодировку '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)

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Поэтому, подумав некоторое время, я удивился, почему решение, предложенное MrFlick, не сработало. Я проверил кодировку файла, созданного этим чанком:

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

После проверки, какая кодировка была test. sql, оказалось, что это ANSI, но это не так не выглядит правильно. Поэтому я вручную изменил свой оригинальный сценарий. sql кодировка на ANSI. После этого он работал совершенно нормально.

Однако это решение не сработало, когда я клонировал репо в среде Ubuntu. В Ubuntu не было проблем с оригинальной кодировкой utf-8.

Надеюсь, это поможет всем, кто имеет дело с этим в windows.

0 голосов
/ 14 апреля 2020

Оператор кодирования говорит R, как интерпретировать имя файла, а не его содержимое. Попробуйте вместо этого:

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

См. Этот ответ для получения более подробной информации: R: не может читать текстовые файлы Unicode, даже если указана кодировка

...