Создайте RSQLite из csv, содержащего умлауты, - затем прочитайте с помощью dplyr

У меня есть большой CSV-файл, содержащий умлауты (Ä/Ö), которые мне нужно преобразовать в базу данных RSQLite для анализа по частям с помощью dplyr. Однако, когда я читаю данные из базы данных, умлауты не воспроизводятся правильно. А становится <c4> и... становится <d6>, read.csvправильно воспроизводит умлауты.

# Create test data

indata<-data.frame(var=c('Ä', 'Ö', 'ä', 'ö', 'ÄÄ_öö'))

write.table(indata, 'test.csv', sep=';', row.names = F, quote=F)

library(DBI)
library(RSQLite)
library(dplyr)

db <- dbConnect(RSQLite::SQLite(), dbname="test") # Create empty database

RSQLite::dbWriteTable(conn = db, name = "testData", # Save csv into database
                  value = "test.csv",
                  row.names = FALSE, header = T, sep=';',
                  colClasses='character')

dbDisconnect(db)


con<-src_sqlite(path='test', create=F)

outdata<-collect(tbl(con, 'testData'))

outdata2<-read.csv('test.csv')

outdata # mangled umlauts
outdata2 # correct umlauts

Как сделать так, чтобы RSQLite сохранял умлауты?

> sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

locale:
[1] LC_COLLATE=Finnish_Finland.1252  LC_CTYPE=Finnish_Finland.1252   
[3] LC_MONETARY=Finnish_Finland.1252 LC_NUMERIC=C                    
[5] LC_TIME=Finnish_Finland.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] dplyr_0.5.0   RSQLite_1.1-2 DBI_0.5-1    

loaded via a namespace (and not attached):
[1] magrittr_1.5   R6_2.2.0       assertthat_0.1 tools_3.3.2    tibble_1.2     memoise_1.0.0 
[7] Rcpp_0.12.9    digest_0.6.12 

2 ответа

Решение

Большой файл, который у вас есть, вероятно, закодирован в Latin-1, но он должен быть в UTF-8 для правильной обработки при импорте CSQL RSQLite. Адаптируйте свой пример, чтобы использовать write.table(..., fileEncoding = "UTF-8") перепроверить. (Обратите внимание, что Windows не имеет кодировки UTF-8 по умолчанию, как правило, большинство других ОС, таких как Linux и OS X, так что пример, который вы привели, будет работать на Linux и OS X.)

использование iconv или же recode чтобы изменить кодировку вашего файла:

iconv -f latin1 in.csv > out.csv # creates new file
recode latin1..utf-8 file.csv    # in-place recoding

Является ли опция записи в SQLite из объекта R данных, а не из файла CSV?

Если это так, это работает для меня:

RSQLite::dbWriteTable(conn = db, name = "testData", 
                      value = indata,
                      row.names = FALSE, overwrite = TRUE)

(или точно такой же обходной путь, используя имя файла CSV:

RSQLite::dbWriteTable(conn = db, name = "testData",
                      value = read.csv2("test.csv"),
                      row.names = FALSE, overwrite = TRUE)
Другие вопросы по тегам