我经常导入巨大的Excel文件,因此在Windows 7上使用包$conn->insert_id
和openxlsx
(readxl
太慢)。
这些包没有指定编码的选项,因此我必须更改"未知"的字符串列的编码标记。 (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;但仍然会复制一次字符串。
答案 0 :(得分:2)
您可以通过直接调用函数的赋值版本来避免其中一个副本,
`Encoding<-`(x,"latin1")
我的猜测是剩下的副本是不可避免的,因为看起来所有字符(R中字符串的更常见名称)对象都是在NAMED
属性设置为2的情况下创建的。您可以通过以下方式检查:
x <- "a"
.Internal(inspect(x))
在干净的R会话中。 (而不是在RStudio中,我相信RStudio以可能误导的方式人为地混淆NAMED
属性。)如果我真的推测,我猜这是某种方式相关的R对所有字符向量使用全局哈希表,这通常可以对字符向量进行大量的性能改进,但在某些情况下可能会产生一些额外的复制。
可以找到关于这些复制问题的进一步阅读here。