Кириллица читается из базы некорректно

Вопросы по статистическому пакету R. Не обязательно гео.
Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

Кириллица читается из базы некорректно

Сообщение VistaSV30 » 22 июн 2020, 15:23

Добрый день!

При чтении функцией read.dbf() из базы в формате dbf кириллический текст превращается в закорючки.

Возможно, это началось после установки R 4.0.0.
Пробовал варианты:
- вернулся к версии R 3.6.3
- Sys.setlocale("LC_CTYPE", "russian")
- Sys.setlocale(category = "LC_ALL", locale = "Russian")
- перезагрузка компьютера

Пока ни чего не помогает.
Подскажите, что надо сделать?

Спасибо!
Последний раз редактировалось VistaSV30 22 июн 2020, 17:09, всего редактировалось 1 раз.
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: Кириллица читается из базы некорректно

Сообщение gamm » 22 июн 2020, 16:28

dbf - это не база, это просто таблица. Перевести в текстовый вид, и спокойно читать read.table() с прямым указанием кодировки.

P.S. Если есть склонность к мазохизму, то почитать тут, в частности как правильно писать параметры локали (см. выхлоп Sys.setlocale())

Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

Re: Кириллица читается из базы некорректно

Сообщение VistaSV30 » 22 июн 2020, 16:57

Это фрагмент моего 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() ?
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane

nickleb
Гуру
Сообщения: 964
Зарегистрирован: 22 май 2010, 20:20
Репутация: 154

Re: Кириллица читается из базы некорректно

Сообщение nickleb » 22 июн 2020, 19:50

gamm писал(а):
22 июн 2020, 16:28
Перевести в текстовый вид, и спокойно читать read.table() с прямым указанием кодировки.
VistaSV30, послушайте мудрого gamm'а ! Конвертируйте Ваши dbf'ы в ASCII через что-либо: "родной"- soft, где Ваши dbf-ы делались, через DBF Commаnder, через Excel и т.д. и т.п.

Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

Re: Кириллица читается из базы некорректно

Сообщение VistaSV30 » 22 июн 2020, 20:52

Хотелось сделать скрипт R, чтоб пользователь только указал имя файла DBF, а всё остальное, чтоб сделал R.
В самом R есть средства исправления кодировки?
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane

nplatonov
Интересующийся
Сообщения: 25
Зарегистрирован: 07 фев 2012, 12:00
Репутация: 20

Re: Кириллица читается из базы некорректно

Сообщение nplatonov » 23 июн 2020, 05:19

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

# 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

nickleb
Гуру
Сообщения: 964
Зарегистрирован: 22 май 2010, 20:20
Репутация: 154

Re: Кириллица читается из базы некорректно

Сообщение nickleb » 23 июн 2020, 08:28

... по кодировке dbf-файла на форуме есть ещё ответ уважаемого gamm'а:
https://gis-lab.info/forum/viewtopic.php?t=19471

Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

Re: Кириллица читается из базы некорректно

Сообщение VistaSV30 » 23 июн 2020, 08:33

Заработало!
Только добавил для текста преобразование 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
На реальных данных тоже работает!

Спасибо!
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane

Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

Re: Кириллица читается из базы некорректно

Сообщение VistaSV30 » 23 июн 2020, 09:02

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 всё было хорошо
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane

nickleb
Гуру
Сообщения: 964
Зарегистрирован: 22 май 2010, 20:20
Репутация: 154

Re: Кириллица читается из базы некорректно

Сообщение nickleb » 23 июн 2020, 09:19

VistaSV30 писал(а):
23 июн 2020, 08:33
a <- sf::st_read("c:/R/D1.DBF")
можно при чтении сразу так:

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

a <- sf::st_read(fileDBF, stringsAsFactors = FALSE)

nickleb
Гуру
Сообщения: 964
Зарегистрирован: 22 май 2010, 20:20
Репутация: 154

Re: Кириллица читается из базы некорректно

Сообщение nickleb » 23 июн 2020, 09:24

nplatonov, спасибо ! -
Попробовал также и получается.
только, видимо, что не в 4, а в 3.6, - так stringsAsFactors = FALSE пришлось добавить:

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

a <- sf::st_read(fileDBF, stringsAsFactors = FALSE)

Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

Re: Кириллица читается из базы некорректно

Сообщение VistaSV30 » 23 июн 2020, 09:32

У меня почему-то в R 4.0.0 и R 4.0.2 возникают проблемы с определением путей к пакетам. Тут вот кодировка стала сбиваться.
И как обычно, нужно срочно заканчивать работу, нет возможности разбираться с ручными настройками.
R 3.6.3 пока меня не подводит - буду работать на нем.
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane

Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

Re: Кириллица читается из базы некорректно

Сообщение VistaSV30 » 25 июн 2020, 00:24

nickleb писал(а):
22 июн 2020, 19:50
Конвертируйте Ваши dbf'ы в ASCII через что-либо: "родной"- soft, где Ваши dbf-ы делались, через DBF Commаnder, через Excel и т.д. и т.п.
Файл dbf создан в программе написанной лет 20 тому назад еще под DOS

https://yadi.sk/d/ZoXbcA1iIqp1Ew

Подскажите, как корректно загрузить его в R?
Кажется уже испробовал всё, что Вы мне советовали.
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane

nplatonov
Интересующийся
Сообщения: 25
Зарегистрирован: 07 фев 2012, 12:00
Репутация: 20

Re: Кириллица читается из базы некорректно

Сообщение nplatonov » 25 июн 2020, 07:46

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

options(stringsAsFactors=FALSE)
Sys.setlocale("LC_CTYPE","Russian")
writeLines("866","f111.cpg")
a <- sf::st_read("f111.dbf")
Encoding(a$TEXT) <- "UTF-8"
a

nickleb
Гуру
Сообщения: 964
Зарегистрирован: 22 май 2010, 20:20
Репутация: 154

Re: Кириллица читается из базы некорректно

Сообщение nickleb » 25 июн 2020, 08:12

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 уже ответил Вам.

Ответить

Вернуться в «R»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 10 гостей