R: 无效的多字节字符串

49

我在R中使用read.delim(filename)函数读取一个以Tab为分隔符的文本文件,此时没有使用任何参数。

df = read.delim(file)

这个按预期工作了,但是现在我得到了一个奇怪的错误信息,而我无法理解它的意思:

Error in type.convert(data[[i]], as.is = as.is[i], dec = dec, na.strings = character(0L)) : 
invalid multibyte string at '<fd>'
Calls: read.delim -> read.table -> type.convert
Execution halted

有人可以解释一下什么是多字节字符串吗?fd是什么意思?在R中还有其他读取制表符文件的方法吗?我有列标题和某些行并非所有列都有数据。


5
请检查文件编码(UTF8?Latin1?),并将其传递给read.delim函数的fileEncoding参数。 - Eduardo Leoni
尝试过了,没有效果。我认为错误在于我的Java程序,在文本文件中放置了一些奇怪的字符。然而,我希望能够听到更多意见,因为我不确定。 - Martin Preusse
您可以发布文件和可重现的示例。这样我们可以提供更多帮助。 - Eduardo Leoni
2
在文本编辑器中打开文件,用眼睛找到奇怪的字符或搜索“<fd>”。多字节字符串是一种使用多个字节存储每个字符的字符串(可能是 Unicode 字符串)。 - Richie Cotton
Richie建议的策略是可行的,只要确保使用不同的编辑器。有些编辑器可能会显示有问题的字符,而其他编辑器则可能不会。 - Roman Luštrik
通常这种情况发生在我接收来自Windows的文件时。大多数情况可以通过read.table(file =“file.txt”,fileEncoding =“latin1”)解决。 - Erick Chacon
5个回答

30
我知道现在已经很晚了,但我遇到了类似的问题,我想分享一下我的解决方法。我使用了iconv实用程序(例如:"iconv file.pcl -f UTF-8 -t ISO-8859-1 -c")。 "-c"选项跳过无法翻译的字符。

14
尝试使用该代码 Sys.setlocale("LC_ALL", "C") 来设置系统本地化。 - user3670684
names(c) <- iconv(paste(children$id,children$name), from="UTF-8", to="UTF-8", sub="NA") - thistleknot

25
如果您需要R语言的解决方案,这里有个我有时用来查找哪些冗余(多字节)字符隐藏在哪里的小型方便函数。请注意,它是在打印出来的文本之后的下一个字符。这能够起作用是因为print能够正常工作,但substr会在存在多字节字符时抛出错误。
find_offending_character <- function(x, maxStringLength=256){  
  print(x)
  for (c in 1:maxStringLength){
    offendingChar <- substr(x,c,c)
    #print(offendingChar) #uncomment if you want the indiv characters printed
    #the next character is the offending multibyte Character
  }    
}

string_vector <- c("test", "Se\x96ora", "works fine")

lapply(string_vector, find_offending_character)

我修复了该字符并再次运行。希望这可以帮助遇到“无效的多字节字符串”错误的人。


3
好的,这篇文章帮助我在非常庞大的 R 字符串中找到了未知/不可见字符。 - pauljohn32

24

我曾经遇到过一个类似的问题,它涉及到从程序e-prime (edat -> SPSS 转换)获取的文件,但后来我发现有许多其他编码可以使用。这对我起了作用:

tbl <- read.delim("dir/file.txt", fileEncoding="UCS-2LE")

6
使用readr时,应使用read_delim(someFile, locale = locale(encoding = "windows-1252"))代替。 - Holger Brandl

0

这种情况发生在我身上,是因为我的字符串中有'版权'符号!一旦它被移除,问题就解决了。

一个好的经验法则是,如果你看到这个错误,请确保将不出现在键盘上的字符删除。


0

我发现Leafpad是一个足够简单的文本编辑器,可以查看和保存/转换某些字符集 - 至少在Linux世界中如此。

我用它来将Latin-15保存为UTF-8,它起作用了。


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