从包含变音符号的 csv 创建 RSQLite - 然后使用 dplyr 读入
Create RSQLite from csv containing umlauts - then read in using 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
从 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)
您拥有的大文件可能采用 Latin-1 编码,但它需要采用 UTF-8 才能被 RSQLite 的 CSV 导入正确处理。调整您的示例以使用 write.table(..., fileEncoding = "UTF-8")
进行双重检查。 (请注意 Windows 默认情况下没有 UTF-8 编码,大多数其他 OS 像 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
我有一个包含元音符号 (Ä/Ö) 的大型 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
从 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)
您拥有的大文件可能采用 Latin-1 编码,但它需要采用 UTF-8 才能被 RSQLite 的 CSV 导入正确处理。调整您的示例以使用 write.table(..., fileEncoding = "UTF-8")
进行双重检查。 (请注意 Windows 默认情况下没有 UTF-8 编码,大多数其他 OS 像 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