【问题标题】:Create RSQLite from csv containing umlauts - then read in using dplyr从包含变音符号的 csv 创建 RSQLite - 然后使用 dplyr 读入
【发布时间】:2017-05-25 11:01:41
【问题描述】:

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


    【解决方案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
    

    【讨论】:

    • 谢谢!将 csv 导出命令修改为:write.table(indata, 'test.csv', sep=';', row.names = F, quote=F, fileEncoding='UTF-8') 在基于 csv 查询 RSQLite 数据库时正确显示 Ä 和 Ö。但是,它仍然会在最终结果中生成 \r 作为行尾字符。所以我得到Ä\r 而不是Ä。应如何建议数据库从最终输出中删除 eol 字符?
    • 您需要在 Windows 上写入二进制连接:stat.ethz.ch/pipermail/r-help/2010-December/263786.html
    【解决方案2】:

    从 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)
    

    【讨论】:

    • 不,文件对于 RAM 来说太大了。
    猜你喜欢
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多