write.xlsx(openxlsx)的编码问题

10
我使用openxlsx包中的write.xlsx()函数将列表对象转换为Excel电子表格,其中列表的每个元素都被转换为Excel文件的一个“工作表”。在过去,这个函数非常有用,我从未遇到过任何问题。据我了解,这个包和特定的函数不需要计算机上的任何特定Java更新才能正常工作。
然而,最近我发现该函数产生了错误。当我为列表运行write.xlsx()时,控制台会显示以下内容:
Error in gsub("&", "&", v, fixed = TRUE) : 
  input string 5107 is invalid UTF-8

我已经确认了导致问题的数据框,但我不确定如何找出是哪部分数据框引起了错误。
我甚至已经针对这个特定的数据框中的所有列使用了enc2utf8()函数,但仍然遇到错误。我已经在数据框本身上使用了substr()函数,并显示每个列的前n个字符,但我没有从输出中看到任何明显的问题。
我甚至已经使用install.packages()函数再次下载openxlsx包,以防有任何更新。
有人知道我该如何找出错误的原因吗?是包中写的函数本身造成的问题吗?如果问题在于数据本身的编码方式,那么enc2utf8()无法解决问题吗?
谢谢!

4
这不是Java问题。您的数据框中有一个非UTF8字符字符串导致了错误。我不确定如何确定哪一行和哪一列有问题的字符串,但我发现iconv函数可以在使用openxlsx::write.xlsx写入数据框时解决这些问题。例如,您可以在数据框的字符列上运行以下代码:dat$col = iconv(dat$col, to="UTF-8") - eipi10
1
如果您需要在数据框列表上执行此操作,可以使用lapply迭代整个列表,然后在每个数据框内部使用lapply对每个字符列运行iconv - eipi10
@eipi10 非常感谢!我的脚本终于可以工作了。显然,这个 icon() 是我需要的函数。我使用 sapply(..., iconv, to = "UTF-8") 读取了所有文本文件,因此不需要执行 lapply()。问题已解决! - im2wddrf
2个回答

12

我刚刚遇到了这个问题。基于这个问题,你可以用以下方法替换数据框中的所有坏字符:

library(dplyr)
df %>%
  mutate_if(is.character, ~gsub('[^ -~]', '', .))

仅针对字符列,或者:

df %>%
  mutate_all(~gsub('[^ -~]', '', .))  

对于所有列,然后使用write.xlsx()将其导出为XLSX。


对我来说很奇怪,stringi::stri_enc_toutf8() 不起作用,但是简单地删除这些字符就可以了。 - Brandon

1
就找错误而言,给定的数字指向了问题(在您的情况下是5107)。这似乎是计算写入文件的字符串数量。要找到特定的数据点,我采用了以下方法:
假设我们的数据框有20个变量,其中10个是字符类型。
- 如果您正在编写列标题(因为所有这些都是字符串),请减去变量的数量(5107-20=5087) - 将余数除以每个观测值的字符变量数(5087/10=508.7);这意味着问题在第509行(因为在标题和前508行之间有5080+20=5100个字符串) - 在第509行中的第7个字符变量将是您的问题所在。

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