2

我有一个包含变音符号 (Ä/Ö) 的大型 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 
4

2 回答 2

1

您拥有的大文件可能以 Latin-1 编码,但它需要采用 UTF-8 才能被 RSQLite 的 CSV 导入正确处理。调整您的示例以用于write.table(..., fileEncoding = "UTF-8")仔细检查。(请注意,Windows 默认情况下没有 UTF-8 编码,大多数其他操作系统(如 Linux 和 OS X)通常都有,因此您提供的示例适用于 Linux 和 OS X。)

使用iconvrecode更改文件的编码:

iconv -f latin1 in.csv > out.csv # creates new file
recode latin1..utf-8 file.csv    # in-place recoding
于 2017-05-25T22:13:38.627 回答
1

从 R 数据框对象而不是从 csv 文件写入 SQLite 是一个选项吗?

如果是,这对我有用:

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)
于 2017-05-25T13:07:42.553 回答