Страница 1 из 2
Кириллица читается из базы некорректно
Добавлено: 22 июн 2020, 15:23
VistaSV30
Добрый день!
При чтении функцией read.dbf() из базы в формате dbf кириллический текст превращается в закорючки.
Возможно, это началось после установки R 4.0.0.
Пробовал варианты:
- вернулся к версии R 3.6.3
- Sys.setlocale("LC_CTYPE", "russian")
- Sys.setlocale(category = "LC_ALL", locale = "Russian")
- перезагрузка компьютера
Пока ни чего не помогает.
Подскажите, что надо сделать?
Спасибо!
Re: Кириллица читается из базы некорректно
Добавлено: 22 июн 2020, 16:28
gamm
dbf - это не база, это просто таблица. Перевести в текстовый вид, и спокойно читать read.table() с прямым указанием кодировки.
P.S. Если есть склонность к мазохизму, то почитать
тут, в частности как правильно писать параметры локали (см. выхлоп Sys.setlocale())
Re: Кириллица читается из базы некорректно
Добавлено: 22 июн 2020, 16:57
VistaSV30
Это фрагмент моего DBF (кодировка 886 Russian MS-DOS)
https://yadi.sk/d/WgFFqJP6tHmK0Q
Это мой код
Код: Выделить всё
library(foreign)
df <- read.dbf("Data/D1.DBF")
df1 <- read.table("Data/D1.DBF", header = T)
Какие параметры должны быть у функции read.table() ?
Re: Кириллица читается из базы некорректно
Добавлено: 22 июн 2020, 19:50
nickleb
gamm писал(а): ↑22 июн 2020, 16:28 Перевести в текстовый вид, и спокойно читать read.table() с прямым указанием кодировки.
VistaSV30, послушайте мудрого
gamm'а ! Конвертируйте Ваши dbf'ы в ASCII через что-либо: "родной"- soft, где Ваши dbf-ы делались, через DBF Commаnder, через Excel и т.д. и т.п.
Re: Кириллица читается из базы некорректно
Добавлено: 22 июн 2020, 20:52
VistaSV30
Хотелось сделать скрипт R, чтоб пользователь только указал имя файла DBF, а всё остальное, чтоб сделал R.
В самом R есть средства исправления кодировки?
Re: Кириллица читается из базы некорректно
Добавлено: 23 июн 2020, 05:19
nplatonov
Код: Выделить всё
# stopifnot(packageVersion("sf")>="0.9-4")
Sys.setlocale("LC_CTYPE","Russian")
writeLines("866","D1.CPG")
a <- sf::st_read("D1.DBF")
Encoding(a$F149) <- "UTF-8"
a
Re: Кириллица читается из базы некорректно
Добавлено: 23 июн 2020, 08:28
nickleb
... по кодировке dbf-файла на форуме есть ещё ответ уважаемого
gamm'а:
https://gis-lab.info/forum/viewtopic.php?t=19471
Re: Кириллица читается из базы некорректно
Добавлено: 23 июн 2020, 08:33
VistaSV30
Заработало!
Только добавил для текста преобразование as.character(), то он загружается в R как Factor
Код: Выделить всё
Sys.setlocale("LC_CTYPE","Russian")
writeLines("866","D1.CPG")
a <- sf::st_read("c:/R/D1.DBF")
a$F149 <- as.character(a$F149)
Encoding(a$F149) <- "UTF-8"
a
На реальных данных тоже работает!
Спасибо!
Re: Кириллица читается из базы некорректно
Добавлено: 23 июн 2020, 09:02
VistaSV30
nickleb писал(а): ↑22 июн 2020, 19:50Конвертируйте Ваши dbf'ы в ASCII через что-либо: "родной"- soft, где Ваши dbf-ы делались, через DBF Commаnder, через Excel и т.д. и т.п.
Родным софтом DBF Commаnder и MS Access исправить ситуацию не получалось.
Сама проблема то возникла после установки новой версии R 4.0.0. До этого пока работал на R 3.6.3 всё было хорошо
Re: Кириллица читается из базы некорректно
Добавлено: 23 июн 2020, 09:19
nickleb
VistaSV30 писал(а): ↑23 июн 2020, 08:33a <- sf::st_read("c:/R/D1.DBF")
можно при чтении сразу так:
Код: Выделить всё
a <- sf::st_read(fileDBF, stringsAsFactors = FALSE)
Re: Кириллица читается из базы некорректно
Добавлено: 23 июн 2020, 09:24
nickleb
nplatonov, спасибо ! -
Попробовал также и получается.
только, видимо, что не в 4, а в 3.6, - так stringsAsFactors = FALSE пришлось добавить:
Код: Выделить всё
a <- sf::st_read(fileDBF, stringsAsFactors = FALSE)
Re: Кириллица читается из базы некорректно
Добавлено: 23 июн 2020, 09:32
VistaSV30
У меня почему-то в R 4.0.0 и R 4.0.2 возникают проблемы с определением путей к пакетам. Тут вот кодировка стала сбиваться.
И как обычно, нужно срочно заканчивать работу, нет возможности разбираться с ручными настройками.
R 3.6.3 пока меня не подводит - буду работать на нем.
Re: Кириллица читается из базы некорректно
Добавлено: 25 июн 2020, 00:24
VistaSV30
nickleb писал(а): ↑22 июн 2020, 19:50Конвертируйте Ваши dbf'ы в ASCII через что-либо: "родной"- soft, где Ваши dbf-ы делались, через DBF Commаnder, через Excel и т.д. и т.п.
Файл dbf создан в программе написанной лет 20 тому назад еще под DOS
https://yadi.sk/d/ZoXbcA1iIqp1Ew
Подскажите, как корректно загрузить его в R?
Кажется уже испробовал всё, что Вы мне советовали.
Re: Кириллица читается из базы некорректно
Добавлено: 25 июн 2020, 07:46
nplatonov
Код: Выделить всё
options(stringsAsFactors=FALSE)
Sys.setlocale("LC_CTYPE","Russian")
writeLines("866","f111.cpg")
a <- sf::st_read("f111.dbf")
Encoding(a$TEXT) <- "UTF-8"
a
Re: Кириллица читается из базы некорректно
Добавлено: 25 июн 2020, 08:12
nickleb
VistaSV30, выше же
nplatonov прекрасный рецепт дал!
Вероятно, засиделись за полночь и не очень внимательны были
особенно к строчке
- ведь в ней, так понимаю, надо прописать вы-parse'-нный корень имени файла...
Даю ниже для Вашего крайнего файла:
Код: Выделить всё
Sys.setlocale("LC_CTYPE","Russian")
fileDBF <- "f111.dbf"
file_extension <- tools::file_ext(fileDBF)
CPGfileDBF <- gsub(file_extension, "CPG", fileDBF)
writeLines("866", CPGfileDBF)
df <- sf::st_read(fileDBF, stringsAsFactors = FALSE)
colnames(df)
Encoding(df$TEXT) <- "UTF-8"
str(df)
Пока, готовил своё к отправке
nplatonov уже ответил Вам.