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

问题描述:

虽然我正在清理包含某些UTF-8编码字符的数据,但在标题中遇到问题。R:read.csv/read.table由于UTF-8编码的字符不识别所有列

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

> 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 

的数据也贴在这里,方便和安全的访问:

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

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

> 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

这是针对您的利益系统设置一些额外的信息:

> 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程序通过在外部存储数据来设置系统区域设置可能具有的任何流失。下面是代码:

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 
+0

你在这个问题上付出了一些努力。谢谢。很多人不想从未知来源下载文件来查看数据。要使您的数据可用于此问题,请使用'输入()'。如果数据量很大,可以通过使用'dput(头())'来占用较小的部分。 – shea

+0

@shea感谢您的建议!我按照您的建议发布了数据 – Xiangyu

+0

我无法复制此行为。使用'read.csv(text = rawContent,header = FALSE)'我得到了一个包含11列的'data.frame'。 –

?Sys.getlocale

“试图改变字符集(由Sys.setlocale(” LC_CTYPE”),如果这意味着不同的字符集)在会议期间可能不工作,并可能导致一些混乱。“

我认为这就是为什么你的代码不起作用的原因。快速解决将是

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