我有这个文件(http://b7hq6v.alterupload.com/en/)我想用read.csv
读R.但我无法检测到正确的编码.它似乎是一种UTF-8.我正在Windows XP机器上使用R2.12.1.
我有这个文件(http://b7hq6v.alterupload.com/en/)我想用read.csv
读R.但我无法检测到正确的编码.它似乎是一种UTF-8.我正在Windows XP机器上使用R2.12.1.
首先,不可能based on more general question on StackOverflow%确定地检测到文件的编码.
我为此奋斗了很多次,最终找到了非自动的解决方案:
使用iconvlist
获得所有可能的编码:
codepages <- setNames(iconvlist(), iconvlist())
然后使用它们中的每一个读取数据
x <- lapply(codepages, function(enc) try(read.table("encoding.asc",
fileEncoding=enc,
nrows=3, header=TRUE, sep="\t"))) # you get lots of errors/warning here
这里重要的是了解文件的 struct (分隔符、标题).使用fileEncoding
参数设置编码.只读几行
unique(do.call(rbind, sapply(x, dim)))
# [,1] [,2]
# 437 14 2
# CP1200 3 29
# CP12000 0 1
似乎正确的一个是,有3行29列,让我们看看:
maybe_ok <- sapply(x, function(x) isTRUE(all.equal(dim(x), c(3,29))))
codepages[maybe_ok]
# CP1200 UCS-2LE UTF-16 UTF-16LE UTF16 UTF16LE
# "CP1200" "UCS-2LE" "UTF-16" "UTF-16LE" "UTF16" "UTF16LE"
你也可以查看数据
x[maybe_ok]
对于您的文件,所有这些编码都会返回相同的数据(部分原因是,正如您所看到的,存在一些冗余).
如果你不知道你的文件的具体内容,你需要在工作流程中使用readLines
进行一些更改(例如,你不能使用fileEncoding
,必须使用length
而不是dim
,使用更多的魔法来找到正确的文件).