无法将Unicode编码的.csv文件读入R

29

我有一个包含以下数据的 .csv 文件:

"Ա","Բ"
1,10
2,20

我无法将其读入R中,以便列名显示为文件中的样子。

d <- read.csv("./Data/1.csv", fileEncoding="UTF-8")
head(d)

生成以下内容:

> d <- read.csv("./Data/1.csv", fileEncoding="UTF-8")
Warning messages:
1: In read.table(file = file, header = header, sep = sep, quote = quote,  :
  invalid input found on input connection './Data/1.csv'
2: In read.table(file = file, header = header, sep = sep, quote = quote,  :
  incomplete final line found by readTableHeader on './Data/1.csv'
> head(d)
[1] X.
<0 rows> (or 0-length row.names)

同时,如果不指定文件编码进行相同操作,则会产生以下结果:

> d <- read.csv("./Data/1.csv")
> head(d)
  Ô. Ô²
1  1 10
2  2 20

当我运行 "file" 工具来查找文件的编码时,它显示为 UTF-8:

Data\1.csv: UTF-8 Unicode text, with CRLF line terminators

我正在使用RStudio,Windows 7操作系统,R版本为2.15.2,32位。

提前致谢。


在我的Linux系统上,使用R 2.15.3完美运行。(第二个警告可能只是文件最后一行缺少“回车”) - Spacedman
5
我可以重现这个问题。虽然我之前没有使用过这些参数,但使用encoding代替,即 read.csv(..., encoding="UTF-8") 可以读取文件,但标题不会显示为字母,而是显示为 X.U.FEFF..U.0531. X.U.0532. - eddi
1
一个观察:`> a = "Ա";
a; [1] "Ա" 运行正常,但这个不行:data.frame(a);

a

#1 <U+0531> `
- eddi
可能的解决方法:手动读入数据并添加名称。 names(data) <- c("Ա","Բ") 当您想要写出数据时会遇到问题。我无法将其写出,但也许有解决办法。 - alap
我在尝试导入一份包含推文的 .csv 文件时遇到了类似的问题。user_nametweet 字段都包含非英文字符等。这里有一个包含数据样本的 gist。有什么好的方法可以正确地导入这个文件并设置正确的编码吗? - Clay
3个回答

14

我在这里写了一篇更长的关于同一个问题的答案:R on Windows: character encoding hell

快速回答,使用参数编码而不是fileEncoding应该可以解决您的第一个问题。您可能无法在RStudio的控制台或表格视图中读取它,但您将能够在公式中使用它。

d <- read.csv("./Data/1.csv", encoding="UTF-8")
head(d)

将您的表格保存为UTF-8文件后:

> test2 <- read.csv("test2.csv", header = FALSE, sep = ",", quote = "\"", dec = ".", fill = TRUE, comment.char = "", encoding = "UTF-8")
Warning message:
In read.table(file = file, header = header, sep = sep, quote = quote,  :
  incomplete final line found by readTableHeader on 'test2.csv'

这将显示在控制台和RStudio视图中的外观

> test2
        V1       V2
1 <U+0531> <U+0532>
2        1       10
3        2       20

然而重要的是,您可以在R中操作它。因此,在我的情况下,可以看到脚本窗口输入Ա具有UTF-8编码,并且grep在表中正确地找到了该编码。

> Encoding("Ա")
[1] "UTF-8"
> grep("Ա", as.character(test2[1,1]))
[1] 1

你可能需要找到适合你设置的编码变体,或者可能需要更改它们。不幸的是,我不确定在哪里进行更改。

你可能无法在所有阶段中使其美观,但在Windows 7环境中肯定可以让它工作。


2
我相信 fileEncoding 是从文件读取时正确的参数,而 encoding 则用于直接文本。 - Sam Brightman

0

我尝试了两种方法来复制您的问题。

我将上面的字符复制到RStudio中,并使用以下代码将其保存为csv:

write.csv(c("Ա","Բ",
             1,10,
             2,20), "test.csv")

df <- read.csv("test.csv")

这个很好用。

然后我想,也许当我用R将它保存为CSV时,R在作弊?所以我只是将字符粘贴到文本文件中,并将其保存为CSV。这种方法也没有问题。

这是我的会话信息:

sessionInfo()
R version 3.0.1 (2013-05-16)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
[1] LC_CTYPE=en_CA.UTF-8       LC_NUMERIC=C               LC_TIME=en_CA.UTF-8       
[4] LC_COLLATE=en_CA.UTF-8     LC_MONETARY=en_CA.UTF-8    LC_MESSAGES=en_CA.UTF-8   
[7] LC_PAPER=C                 LC_NAME=C                  LC_ADDRESS=C              
[10] LC_TELEPHONE=C             LC_MEASUREMENT=en_CA.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats4    grid      stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] party_1.0-9       modeltools_0.2-21 strucchange_1.4-7 sandwich_2.2-10   zoo_1.7-10       
[6] GGally_0.4.4      reshape_0.8.4     plyr_1.8          ggplot2_0.9.3.1  

loaded via a namespace (and not attached):
[1] coin_1.0-23        colorspace_1.2-2   dichromat_2.0-0    digest_0.6.3      
[5] gtable_0.1.2       labeling_0.2       lattice_0.20-23    MASS_7.3-29       
[9] munsell_0.4.2      mvtnorm_0.9-9995   proto_0.3-10       RColorBrewer_1.0-5
[13] reshape2_1.2.2     scales_0.2.3       splines_3.0.1      stringr_0.6.2 

0

我曾经遇到过同样的问题,后来发现文件损坏了。

我使用OpenOffice打开该文件,并使用“UTF8”字符集重新保存它(您需要点击编辑过滤器设置框),然后使用read.csv()(无编码或文件编码选项)导入,这样就可以正常工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接