虽然我正在清理包含一些UTF-8编码字符的数据,但我在标题中遇到了这个问题。
在更详细地描述问题之前,让我先花一些时间来解释样本数据,可以从here下载。样本数据是维度1乘11的.csv。避免使用read.table
或read.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.table
和read.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 :(得分:1)
来自?Sys.getlocale
:
&#34;在会话期间尝试更改字符集(通过Sys.setlocale(&#34; LC_CTYPE&#34;,),如果这意味着不同的字符集)可能无法工作,并且很可能导致有些混乱。&#34;
我认为这就是您的代码不起作用的原因。快速修复将是
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