首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R: read.csv/read.table由于UTF-8编码字符无法识别所有列

R: read.csv/read.table由于UTF-8编码字符无法识别所有列
EN

Stack Overflow用户
提问于 2017-10-11 16:45:01
回答 1查看 445关注 0票数 1

当我清理包含一些UTF-8编码字符的数据时,我在标题中遇到了问题。

在进一步详细描述这个问题之前,让我先花一些时间来解释示例数据,这些数据可以从这里下载。示例数据是维为1乘11的.csv。快速检查可以避免使用read.tableread.csv

代码语言:javascript
复制
> con <- file(description = file.path(somedir, 'test.csv'), open = 'rb', encoding = 'UTF-8')
> rawContent <- readLines(con = con, encoding = 'UTF-8')
> close(con)

# check dimension
> colcounts <- sapply(rawContent, function(x){length(gregexpr(pattern = ',', text = x)[[1]])})
> names(colcounts) <- seq_along(rawContent)
> colcounts
 1
10

为了方便和安全地访问,这些数据也张贴在这里:

代码语言:javascript
复制
> dput(rawContent)
"100003516,B,110102,00921,100044,图书、报纸制版印刷,印刷设备生产,印刷器材文化用品销售,2311,1,"

现在的问题是,这些UTF-8编码字符的存在某种程度上使读取器如read.tableread.csv出现故障。更具体地说,它不识别所有列。

代码语言:javascript
复制
> df1 = read.table(text = rawContent, header = F, sep = ',', quote = '', comment.char = '', encoding = 'UTF-8')
> dim(df1)
[1]  1 9
> print(df1)
    V1 V2     V3  V4     V5                              V6                        V7 V8 V9
1 100003516  B 110102 921 100044 图书、报纸制版印刷,印刷设备生产 印刷器材文化用品销售,2311  1 NA

如您所见,即使我关闭了,V6, V7中的逗号quote也被识别为内容。使用read.csv会产生类似的结果,read.delim也会产生类似的结果。欢迎您提出任何意见、建议或解决方案!谢谢!

附录171013

以下是一些关于您感兴趣的系统设置的其他信息:

代码语言:javascript
复制
> Sys.getlocale()
[1] "LC_COLLATE=Chinese (Simplified)_China.936;LC_CTYPE=Chinese (Simplified)_China.936;LC_MONETARY=Chinese (Simplified)_China.936;LC_NUMERIC=C;LC_TIME=Chinese (Simplified)_China.936"

> l10n_info()
$MBCS
[1] TRUE

$`UTF-8`
[1] FALSE

$`Latin-1`
[1] FALSE

$codepage
[1] 936

> Encoding(rawContent)
[1] "UTF-8"

附录20171015

除了以下出色的答案外,我还偶然找到了一个解决办法。我不太明白它是如何工作的,但与@Karsten W所提到的一致,它可能是通过绕过R程序通过外部存储数据来设置系统区域设置的任何搅动。以下是密码:

代码语言:javascript
复制
rawCotent <- "100003516,B,110102,00921,100044,图书、报纸制版印刷,印刷设备生产,印刷器材文化用品销售,2311,1,"

con <- file(description = 'text.csv', open = 'wb', encoding = 'UTF-8')
writeLines(text = rawContent, con = con, useBytes = T)
close(con)

df <- read.csv(file = 'text.csv', header = F, encoding = 'UTF-8')
print(df)
         V1 V2     V3  V4     V5                 V6           V7                   V8   V9 V10 V11
1 100003516  B 110102 921 100044 图书、报纸制版印刷 印刷设备生产 印刷器材文化用品销售 2311   1  NA
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-13 21:28:39

来自?Sys.getlocale

在会话期间尝试更改字符集(通过Sys.setlocale("LC_CTYPE“) (如果这意味着不同的字符集)可能不起作用,可能会导致一些混乱。

我认为这就是为什么您的代码不能工作的原因。一个快速的解决办法就是

代码语言:javascript
复制
cset <- Sys.getlocale("LC_CTYPE")
Sys.setlocale("LC_CTYPE", "C")
rawContent <- "100003516,B,110102,00921,100044,图书、报纸制版印刷,印刷设备生产,印刷器材文化用品销售,2311,1,"
dat <- read.csv(text=rawContent, header=FALSE)
Sys.setlocale("LC_CTYPE", cset)
ncol(dat)
[1] 11
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46693563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档