Создайте 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)