Страница 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 прекрасный рецепт дал!
Вероятно, засиделись за полночь и не очень внимательны были :)
особенно к строчке

Код: Выделить всё

writeLines("866",,,,)

- ведь в ней, так понимаю, надо прописать вы-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 уже ответил Вам.