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

问题描述 投票:0回答:11

我正在尝试导入日语的 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 参数,但在每种情况下都收到相同的“无效多字节字符串”消息。是否应该使用不同的编码,或者是否存在其他问题?

r read.csv
11个回答
104
投票

Encoding
设置字符串的编码。它没有设置字符串表示的文件的编码,这就是你想要的。

这对我有用,在尝试之后

"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=""))))

17
投票

您可能因为系统区域设置不兼容而遇到此问题 尝试使用此代码设置系统区域设置

Sys.setlocale("LC_ALL", "C")


12
投票

来自 tidyverse 宇宙的 readr 包可能会有所帮助。

您可以使用

read_csv()
函数及其编码参数,通过
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
投票

对于那些使用

Rattle
的人来说,这是我解决它的方法:

  1. 首先确保退出 rattle 这样你就可以在 R 命令提示符下
  2. > library (rattle)
    (如果还没有这样做)
  3. > crv$csv.encoding="latin1"
  4. > rattle()
  5. 你现在应该可以继续了。即,import your csv > Execute > Model > Execute etc.

这对我有用,希望能帮助疲惫的旅行者


0
投票

我在科学文章中遇到了类似的问题,并在这里找到了一个很好的解决方案: http://tm.r-forge.r-project.org/faq.html

通过使用以下代码行:

tm_map(yourCorpus, content_transformer(function(x) iconv(enc2utf8(x), sub = "byte")))

您将多字节字符串转换为十六进制代码。 我希望这会有所帮助。


0
投票

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


0
投票

我有同样的错误并尝试了以上所有无济于事。当我从 R 3.4.0 升级到 3.4.3 时,这个问题就消失了,所以如果你的 R 版本不是最新的,请更新它!


0
投票

我最近遇到了这个错误(

invalid multibyte string 1
),但我的问题有点不同:

忘记保存一个带扩展名的csv.gz文件,尝试用

read_csv()
读取。添加扩展程序解决了问题。


0
投票

重复重现多字节字符上的 read.csv 错误:

R 的

read.csv()
如果需要一个数字,它会呕吐所有多字节字符。

我用的版本:

R version 4.2.1 (2022-06-23)

将此数据放入名为的文件中:

/tmp/foo.csv

#year,someval 
2022,0.1389 
2021,0.0000°
2020,0.2857

如果你仔细观察,你会看到第 2 行的

0.0000
值上面有一个“度”符号。

使用 read.csv 以这种方式加载它:

> read.csv('/tmp/foo.csv')

Error in type.convert.default(data[[i]], as.is = as.is[i], dec = dec,  : 
  invalid multibyte string at '<b0>0'
Calls: read.csv -> read.table -> type.convert -> type.convert.default
Execution halted

cat
对那个废话有什么看法:

$ cat /tmp/foo.csv 
#year,someval
2022,0.1389
2021,0.0000�
2020,0.2857

我们不容忍那个“度”符号。更改编码无济于事。您可以尝试告诉 read.csv 将所有内容解释为字符串,但现在您在下游遇到了字符串到数字的转换问题。

read.csv2 有什么要说的?:

> read.csv2('/tmp/foo.csv')
  X.year.someval
1 2022,0.1389
2 2021,0.000\xb0
3 2020,0.2857

https://www.codetable.net/hex/b0


0
投票

您是否使用复制粘贴来创建 CSV 文件?我遇到了同样的错误,并成功尝试了该线程中最流行的解决方案 (fileEncoding="latin1")。在我将数据框重新保存到 CSV 文件中后,我发现一些单元格在单元格值(编码为波浪号)之后有额外的空间。我删除了原始文件中的这些空格,并且能够在没有 fileEncoding="latin1" 并且没有任何错误的情况下读取它。

© www.soinside.com 2019 - 2024. All rights reserved.