Size: a a a

R (язык программирования)

2020 November 10

АК

Артём Клевцов... in R (язык программирования)
Alexander Semenov
Ну и риторический вопрос: почему на винде fread сработал гладко?
Потому что по стечению обстоятельств кодировка файла совпала с системной.
источник

AS

Alexander Semenov in R (язык программирования)
Т.е. заменив системную локаль на российскую на маке мне не потребуется возиться с iconv?
источник

АК

Артём Клевцов... in R (язык программирования)
Alexander Semenov
Т.е. заменив системную локаль на российскую на маке мне не потребуется возиться с iconv?
Нет.
источник

АК

Артём Клевцов... in R (язык программирования)
Не знаю, что ты там на что менять собрался, но почти на всех современных юниксах везде UTF-8.
источник

AS

Alexander Semenov in R (язык программирования)
Вот и я пока не знаю. Мне бы файл на маке прочитать с минимумом телодвижений и приключений.
источник

АК

Артём Клевцов... in R (язык программирования)
Alexander Semenov
Вот и я пока не знаю. Мне бы файл на маке прочитать с минимумом телодвижений и приключений.
Всё ты правильно нагуглил. Можно и в R:
> library(data.table)
>
> tmp1 <- tempfile()
> dt1 <- data.table(
+   "Столбец А" = "Текст"
+ )
> fwrite(dt1, tmp1)
> tmp2 <- tempfile()
> system(sprintf("iconv -f utf8 -t cp1251 %s > %s", tmp1, tmp2))
> str(fread(file = tmp2, encoding = "UTF-8"))
Classes 'data.table' and 'data.frame':  1 obs. of  1 variable:
$ ������� �: chr "\xd2\xe5\xea\xf1\xf2"
- attr(*, ".internal.selfref")=<externalptr>
> str(fread(cmd = sprintf("iconv -f cp1251 -t utf8 %s", tmp2)))
Classes 'data.table' and 'data.frame':  1 obs. of  1 variable:
$ Столбец А: chr "Текст"
- attr(*, ".internal.selfref")=<externalptr>
>
> read_file <- function(path, enc = uchardet::detect_file_enc(path)) {
+   con <- file(path, encoding = enc)
+   on.exit(close(con))
+   res <- readLines(con)
+   res <- paste(res, collapse = "\n")
+   return(res)
+ }
> str(fread(text = read_file(tmp2)))
Classes 'data.table' and 'data.frame':  1 obs. of  1 variable:
$ Столбец А: chr "Текст"
источник

АК

Артём Клевцов... in R (язык программирования)
Артём Клевцов
Всё ты правильно нагуглил. Можно и в R:
> library(data.table)
>
> tmp1 <- tempfile()
> dt1 <- data.table(
+   "Столбец А" = "Текст"
+ )
> fwrite(dt1, tmp1)
> tmp2 <- tempfile()
> system(sprintf("iconv -f utf8 -t cp1251 %s > %s", tmp1, tmp2))
> str(fread(file = tmp2, encoding = "UTF-8"))
Classes 'data.table' and 'data.frame':  1 obs. of  1 variable:
$ ������� �: chr "\xd2\xe5\xea\xf1\xf2"
- attr(*, ".internal.selfref")=<externalptr>
> str(fread(cmd = sprintf("iconv -f cp1251 -t utf8 %s", tmp2)))
Classes 'data.table' and 'data.frame':  1 obs. of  1 variable:
$ Столбец А: chr "Текст"
- attr(*, ".internal.selfref")=<externalptr>
>
> read_file <- function(path, enc = uchardet::detect_file_enc(path)) {
+   con <- file(path, encoding = enc)
+   on.exit(close(con))
+   res <- readLines(con)
+   res <- paste(res, collapse = "\n")
+   return(res)
+ }
> str(fread(text = read_file(tmp2)))
Classes 'data.table' and 'data.frame':  1 obs. of  1 variable:
$ Столбец А: chr "Текст"
read_file, кстати, на винде тоже будет работать. Проблемы будут только с UTF-16.
источник

AS

Alexander Semenov in R (язык программирования)
Спасибо. На всякий случай попросил авторов этих выгрузок сменить кодировку. Пусть тоже страдают.
источник

АК

Артём Клевцов... in R (язык программирования)
stringi::stri_read_lines также позволяет указать кодировку, чтобы не использовать connection.
источник

AS

Alexander Semenov in R (язык программирования)
Ну раз уж об этом зашла речь, то такой вопрос давно назревал: тут есть страдальцы типа меня, которым приходится одни и те же файлы на винде и на маке открывать? Как вы это менеджерите?
источник

АК

Артём Клевцов... in R (язык программирования)
Alexander Semenov
Ну раз уж об этом зашла речь, то такой вопрос давно назревал: тут есть страдальцы типа меня, которым приходится одни и те же файлы на винде и на маке открывать? Как вы это менеджерите?
Если важна кроссплатформенность в аспекте IO, да ещё отягощённая локализацией, то акромя stringi пакетов, закрывающих вопрос почти нет. Ну и uchardet для автодетекта, но и он не идеален.
источник

АК

Артём Клевцов... in R (язык программирования)
В стрингах, к слову есть свой автодетект, но гораздо хуже, чем uchardet и вывод у него не очень удобный.
источник

N

N Boolean in R (язык программирования)
Alexander Semenov
Ну раз уж об этом зашла речь, то такой вопрос давно назревал: тут есть страдальцы типа меня, которым приходится одни и те же файлы на винде и на маке открывать? Как вы это менеджерите?
Другая, но близкая проблема - начальство на маках. Проверяю в wsl, что возникшая проблема - это проблема винды. Если так, иду в Линукс и делаю там =(
источник

AS

Alexander Semenov in R (язык программирования)
Ну да. Мой вопрос еще касался фрагментов самого кода. На винде у меня одна рабочая директория, на маке другая, ещё какие-то небольшие фрагменты кода, которые касаются только одной из ОС.
источник

ВП

Владимир Попукайло... in R (язык программирования)
Alexander Semenov
Ну да. Мой вопрос еще касался фрагментов самого кода. На винде у меня одна рабочая директория, на маке другая, ещё какие-то небольшие фрагменты кода, которые касаются только одной из ОС.
детектить ось и делать ветвления в нужных местах?
источник

ВП

Владимир Попукайло... in R (язык программирования)
я так подключения к базам только для win/unix добавлял. по кодировкам проще везде стараться использовать utf-8, где это от тебя зависит
источник

АК

Артём Клевцов... in R (язык программирования)
Alexander Semenov
Ну да. Мой вопрос еще касался фрагментов самого кода. На винде у меня одна рабочая директория, на маке другая, ещё какие-то небольшие фрагменты кода, которые касаются только одной из ОС.
Код не должен зависеть ни от ОС, ни от рабочей директории. Ветвление в коде по ОС делается только в крайних случаях, когда нет кросплатформенного решения.
Хотя... Если взглянуть правде в глаза, куча людей в коде пишет setwd, абсолютные пути  или что-то подобное...
источник

N

N Boolean in R (язык программирования)
Артём Клевцов
Код не должен зависеть ни от ОС, ни от рабочей директории. Ветвление в коде по ОС делается только в крайних случаях, когда нет кросплатформенного решения.
Хотя... Если взглянуть правде в глаза, куча людей в коде пишет setwd, абсолютные пути  или что-то подобное...
Расскажите, пожалуйста, почему setwd не оч?
источник

PU

Philipp Upravitelev in R (язык программирования)
я студентам даже не заикаюсь о кодировках
а setwd им преподы некоторые рассказывают
источник

PU

Philipp Upravitelev in R (язык программирования)
N Boolean
Расскажите, пожалуйста, почему setwd не оч?
запутаться легко можно, что где. и убивает всю портируемость скриптов, как и абсолютные пути
источник