【问题标题】:Invalid multibyte string in read.csvread.csv 中的多字节字符串无效
【发布时间】:2012-12-31 01:09:01
【问题描述】:

我正在尝试导入日文的 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) &lt;- 'UTF-8' 和 latin1)并尝试删除 read.csv 参数,但在每种情况下都收到相同的“无效多字节字符串”消息。是否应该使用不同的编码,还是有其他问题?

【问题讨论】:

  • 您是否尝试将参数encoding="UTF-8" 设置为read.csv()
  • 是的,结果相同。

标签: r read.csv


【解决方案1】:

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

【讨论】:

  • 谢谢。从this question 我尝试使用Sys.setlocale 将本地设置为日语,但这也不起作用(“操作系统报告将语言环境设置为“日语”的请求无法兑现”)。
  • 是的,read.csv("foobar.csv", fileEncoding = "latin1") 为我工作。我有一个 Excel 文件并保存为 CSV,然后必须将 fileEncoding 设置为“latin1”才能在 R 中读取该 CSV。
  • @Joshua Ulrich,如果我的代码看起来像这样怎么办? file.list &lt;- list.files(pattern = '*.txt') file.list &lt;- file.list[order(nchar(file.list), file.list)] df.list &lt;- lapply(file.list, read_file) df_virgi &lt;- do.call(rbind.data.frame, df.list) 我应该在哪里放置 **fileEncoding = "latin1"?非常感谢!
【解决方案2】:

您可能因为系统区域设置不兼容而遇到此问题 尝试使用此代码设置系统区域设置Sys.setlocale("LC_ALL", "C")

【讨论】:

    【解决方案3】:

    对于那些使用Rattle 来解决这个问题的人我是这样解决的:

    1. 首先确保在 R 命令提示符下退出嘎嘎声
    2. &gt; library (rattle)(如果尚未这样做)
    3. &gt; crv$csv.encoding="latin1"
    4. &gt; rattle()
    5. 您现在应该可以继续了。即,导入您的 csv > Execute > Model > Execute 等等。

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

    【讨论】:

      【解决方案4】:

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

      通过使用以下代码行:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          来自 tidyverse 世界的 readr 包可能会有所帮助。

          您可以使用read_csv() 函数及其编码参数通过read_csv() 函数的本地参数设置编码:

          read_csv(file = "http://www.mof.go.jp/international_policy/reference/itn_transactions_in_securities/week.csv",
                   skip = 14,
                   local = locale(encoding = "latin1"))
          

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

              我为这个问题找到的最简单的解决方案是在不丢失任何数据/特殊字符的情况下(例如,当使用 fileEncoding="latin1" 像欧元符号 € 这样的字符时会丢失)是首先在像 Sublime Text 这样的文本编辑器中打开文件,并“使用编码保存 - UTF-8”。

              然后 R 可以毫无问题地导入文件,也不会丢失字符。

              【讨论】:

                【解决方案9】:

                我最近遇到了这个错误(invalid multibyte string 1),但我的问题有点不同:

                我们忘记保存带有扩展名的 csv.gz 文件,并尝试使用 read_csv() 读取它。添加扩展解决了这个问题。

                【讨论】:

                  猜你喜欢
                  • 2015-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-12-11
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-05-11
                  • 1970-01-01
                  • 2021-09-02
                  相关资源
                  最近更新 更多