无需内存复制即可有效更改R字符编码(编码功能)

时间:2015-11-30 22:38:19

标签: r excel encoding character-encoding

我经常导入巨大的Excel文件,因此在Windows 7上使用包$conn->insert_idopenxlsxreadxl太慢)。

这些包没有指定编码的选项,因此我必须更改"未知"的字符串列的编码标记。 (native = Windows codepage 1252)到UTF-8,这是Excel的XLSX文件的标准编码。

更改R"字符串"的R&#编码标记的最有效方法是什么? (字符向量)而不会导致原始字符串被复制?

R有xlsx::read.xlsx[2]Encoding()更改编码标记,我只使用它来修复错误的编码标记而不更改字符串的原始字节。

即使enc2utf8不应该更改字符串本身的字节(=不转换字符串,如Encoding()),字符串也会被复制一次或多次:

iconv

PS:> x <- "fa\xE7ile" > x [1] "fa\xe7ile" > charToRaw(x) [1] 66 61 e7 69 6c 65 > tracemem(x) [1] "<0x47030f8>" > Encoding(x) [1] "unknown" > Encoding(x) <- "latin1" tracemem[0x47030f8 -> 0x4463118]: tracemem[0x4463118 -> 0x44630e8]: Encoding<- > x [1] "façile" > charToRaw(x) [1] 66 61 e7 69 6c 65 > enc2utf8(x) tracemem[0x44630e8 -> 0x4706e38]: [1] "façile" > charToRaw(x) [1] 66 61 e7 69 6c 65 声明的帮助&#34;它们是原始功能,旨在进行最小化复制。&#34;但仍然会复制一次字符串。

1 个答案:

答案 0 :(得分:2)

您可以通过直接调用函数的赋值版本来避免其中一个副本,

`Encoding<-`(x,"latin1")

我的猜测是剩下的副本是不可避免的,因为看起来所有字符(R中字符串的更常见名称)对象都是在NAMED属性设置为2的情况下创建的。您可以通过以下方式检查:

x <- "a"
.Internal(inspect(x))

在干净的R会话中。 (而不是在RStudio中,我相信RStudio以可能误导的方式人为地混淆NAMED属性。)如果我真的推测,我猜这是某种方式相关的R对所有字符向量使用全局哈希表,这通常可以对字符向量进行大量的性能改进,但在某些情况下可能会产生一些额外的复制。

可以找到关于这些复制问题的进一步阅读here