read.csv中的无效多字节字符串

73

我想导入一个日语的csv文件。这段代码:

url <- 'http://www.mof.go.jp/international_policy/reference/itn_transactions_in_securities/week.csv'
x <- read.csv(url, header=FALSE, stringsAsFactors=FALSE)

返回以下错误:

Error in type.convert(data[[i]], as.is = as.is[i], dec = dec, na.strings = character(0L)) : 
invalid multibyte string at '<91>ΊO<8b>y<82>ёΓ<e0><8f>،<94><94><84><94><83><8c>_<96>̏@(<8f>T<8e><9f><81>E<8e>w<92><e8><95>@<8a>փx<81>[<83>X<81>j'
我尝试更改编码(Encoding(url) <- 'UTF-8'和latin1),并尝试删除read.csv参数,但每种情况都收到相同的“无效的多字节字符串”消息。是否应使用不同的编码,或者存在其他问题?

你尝试过在 read.csv() 函数中设置参数 encoding="UTF-8" 吗? - Andrie
2
是的,结果相同。 - jaredwoodard
12个回答

111

编码设置字符字符串的编码方式,但它不会设置字符字符串所代表的文件的编码方式,这可能是你需要的。

我在尝试了"UTF-8"后,这对我起作用了。

x <- read.csv(url, header=FALSE, stringsAsFactors=FALSE, fileEncoding="latin1")

你可能希望跳过前16行,单独查看标题。无论哪种方式,仍然需要进行相当数量的清理工作。

x <- read.csv(url, header=FALSE, stringsAsFactors=FALSE,
  fileEncoding="latin1", skip=16)
# get started with the clean-up
x[,1] <- gsub("\u0081|`", "", x[,1])    # get rid of odd characters
x[,-1] <- as.data.frame(lapply(x[,-1],  # convert to numbers
  function(d) type.convert(gsub(d, pattern=",", replace=""))))

谢谢。根据这个问题的建议,我尝试使用Sys.setlocale将本地设置为日语,但也不起作用(“操作系统报告无法满足将本地设置为“日语”的请求”)。 - jaredwoodard
1
是的,read.csv("foobar.csv", fileEncoding = "latin1") 对我有效。我有一个Excel文件并将其保存为CSV,然后必须将fileEncoding设置为"latin1"才能在R中读取该CSV文件。 - Dan Jarratt
@Joshua Ulrich,如果我的代码看起来像这样呢?file.list <- list.files(pattern = '*.txt') file.list <- file.list[order(nchar(file.list), file.list)] df.list <- lapply(file.list, read_file) df_virgi <- do.call(rbind.data.frame, df.list)我应该把**fileEncoding = "latin1"放在哪里?非常感谢! - Rollo99

18

可能是由于系统语言环境不兼容而导致您遇到了此问题

尝试使用以下代码设置系统语言环境Sys.setlocale("LC_ALL", "C")


12
从tidyverse宇宙中,readr包可能会有所帮助。
您可以通过read_csv()函数的local参数设置编码,方法是使用local()函数和其编码参数:
read_csv(file = "http://www.mof.go.jp/international_policy/reference/itn_transactions_in_securities/week.csv",
         skip = 14,
         local = locale(encoding = "latin1"))

3

我发现解决这个问题最简单的方法是不会丢失任何数据/特殊字符(例如在使用fileEncoding="latin1"时,类似欧元符号€的字符将会丢失),先在文本编辑器(比如Sublime Text)中打开文件,然后使用“用UTF-8编码保存”功能进行保存。

然后R就可以导入该文件而不会出现任何问题或字符丢失。


0
我最近遇到了这个错误(invalid multibyte string 1),但我的问题有点不同:
我们忘记为一个csv.gz文件保存扩展名,然后尝试使用read_csv()来读取它。添加扩展名解决了问题。

0

如果您尝试导入的文件最初是Excel文件,请确保打开原始文件并另存为csv格式,当我将其导入R时,这样修复了错误。


0
对于那些在使用Rattle时遇到这个问题的人,这是我解决它的方法:
1. 首先确保退出Rattle,使你在R命令提示符下。 2. 如果还没有这样做,输入`> library (rattle)`。 3. 输入`> crv$csv.encoding="latin1"`。 4. 输入`> rattle()`。 5. 现在你应该能够继续操作。例如,导入你的CSV文件,执行模型等。
以上方法对我有效,希望对疲惫的旅行者有所帮助。

0

我遇到了同样的错误,并尝试了以上所有方法,但都无济于事。当我将 R 3.4.0 升级到 3.4.3 时,问题消失了,因此如果您的 R 版本不是最新的,请更新它!


0

你是用复制粘贴的方式创建CSV文件吗?我之前也遇到过同样的错误,成功地尝试了这个帖子中最受欢迎的解决方案(fileEncoding="latin1")。在我将数据框重新保存为CSV文件后,发现一些单元格的值后面有额外的空格(以A-tilde编码)。我在原始文件中去掉了这些空格,然后就能够不使用fileEncoding="latin1" 且没有任何错误地读取它了。


这实际上并没有回答问题。如果你有不同的问题,你可以点击提问进行提问。如果你希望在这个问题有新的回答时收到通知,你可以关注此问题。一旦你拥有足够的声望,你还可以设置悬赏来吸引更多关注。- 来自审查 - Paul Stafford Allen

0

我在使用read_lines读取SQL文件时遇到了DBI连接问题,但似乎文件与此无关。重新连接(重新连接)我的SQL连接解决了这个问题。

我不知道这是什么奇怪的行为。

Sys.info()
       sysname        release        version             machine 
     "Windows"       "10 x64"  "build 19044"             "x86-64" 

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