Экспорт спецификации UTF-8 в .csv в R - PullRequest
8 голосов
/ 13 сентября 2011

Я читаю файл через RJDBC из базы данных MySQL, и он правильно отображает все буквы в R (например, נווה שאנן). Однако даже при экспорте с использованием write.csv и fileEncoding = "UTF-8" вывод выглядит следующим образом <U+0436>.<U+043A>. <U+041B><U+043E><U+0437><U+0435><U+043D><U+0435><U+0446> (в данном случае это не строка выше, а болгарская) для болгарского, иврита, китайского и так далее. Другие специальные символы, такие как ã, ç и т. Д., Работают нормально.

Я подозреваю, что это из-за спецификации UTF-8, но я не нашел решения в сети

Моя ОС - немецкая Windows7.

редактировать: я пытался

con<-file("file.csv",encoding="UTF-8")
write.csv(x,con,row.names=FALSE)

и (afaik) эквивалент write.csv(x, file="file.csv",fileEncoding="UTF-8",row.names=FALSE).

Ответы [ 2 ]

6 голосов
/ 14 сентября 2011

На странице справки по Encoding (help("Encoding")) вы можете прочитать о специальной кодировке - bytes.

С помощью этого я смог сгенерировать CSV-файл:

v <- "נווה שאנן"
X <- data.frame(v1=rep(v,3), v2=LETTERS[1:3], v3=0, stringsAsFactors=FALSE)

Encoding(X$v1) <- "bytes"
write.csv(X, "test.csv", row.names=FALSE)

Позаботьтесь о различиях между factor и character. Следующее должно работать:

id_characters <- which(sapply(X,
    function(x) is.character(x) && Encoding(x)=="UTF-8"))
for (i in id_characters) Encoding(X[[i]]) <- "bytes"

id_factors <- which(sapply(X,
    function(x) is.factor(x) && Encoding(levels(x))=="UTF-8"))
for (i in id_factors) Encoding(levels(X[[i]])) <- "bytes"

write.csv(X, "test.csv", row.names=FALSE)
5 голосов
/ 31 декабря 2016

Принятый ответ не помог мне в аналогичном приложении (R 3.1 в Windows, когда я пытался открыть файл в Excel). Во всяком случае, на основании этой части файла документации:

Если требуется спецификация (это не рекомендуется), при написании она должна быть написана явно, например, с помощью writeChar ("\ ufeff", con, eos = NULL) или writeBin (as.raw (c (0xef, 0xbb, 0xbf)), binary_con)

Я нашел следующий способ:

write.csv.utf8.BOM <- function(df, filename)
{
    con <- file(filename, "w")
    tryCatch({
    for (i in 1:ncol(df))
        df[,i] = iconv(df[,i], to = "UTF-8") 
    writeChar(iconv("\ufeff", to = "UTF-8"), con, eos = NULL)
    write.csv(df, file = con)
    },finally = {close(con)})
}

Обратите внимание, что df - это data.frame, а filename - это путь к CSV-файлу.

...