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

person Maarölli    schedule 25.05.2017    source источник


Ответы (2)


Большой файл, который у вас есть, вероятно, закодирован в Latin-1, но он должен быть в UTF-8, чтобы правильно обрабатываться при импорте CSV 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
person krlmlr    schedule 25.05.2017
comment
Благодарю вас! Изменение команды экспорта csv следующим образом: write.table(indata, 'test.csv', sep=';', row.names = F, quote=F, fileEncoding='UTF-8') правильно отображает Ä и Ö при запросе базы данных RSQLite на основе csv. Однако он по-прежнему выдает \r в качестве символа конца строки в окончательных результатах. Поэтому я получаю Ä\r вместо Ä. Как следует посоветовать базе данных удалить символы eol из окончательного вывода? - person Maarölli; 26.05.2017
comment
Вам нужно будет записать бинарное соединение в Windows: stat .ethz.ch/pipermail/r-help/2010-December/263786.html - person krlmlr; 27.05.2017

Является ли вариант записи в SQLite из объекта R dataframe, а не из файла 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)
person Aurèle    schedule 25.05.2017
comment
Нет, файл слишком велик для оперативной памяти. - person Maarölli; 25.05.2017