Mar*_*ras 47 r utf-8 character-encoding data.table
我在R中的字符向量编码不一致时遇到问题
我从中读取表格的文本文件被编码(通过Notepad++)UTF-8(我也尝试UTF-8 without BOM过).
我想从这个文本文件中读取表,转换它data.table,设置key并使用二进制搜索.当我试图这样做时,出现以下情况:
警告消息:在
[.data.table(poli.dt,"żżonymi",mult ="first")中:在连接列中检测到已知编码(latin1或UTF-8).data.table比较当前的字节数,因此不支持 混合编码; 即,使用latin1和UTF-8,或者如果任何未知编码是非ascii,其中一些已标记为已知而其他未标记.但是如果单独使用latin1或UTF-8,并且所有未知编码都是ascii,那么结果应该没问题.将来我们会检查你,如果一切正常,请避免这个警告.棘手的部分是这样做而不会影响ascii唯一案例的性能.
和二进制搜索不起作用.
我意识到,我的data.table- key列包括两个:"未知"和"UTF-8"编码类型:
> table(Encoding(poli.dt$word))
unknown UTF-8
2061312 2739122
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下方法转换此列(在创建data.table对象之前):
Encoding(word) <- "UTF-8"word<- enc2utf8(word)但没有效果.
我还尝试了几种不同的方法将文件读入R(设置所有有用的参数,例如encoding = "UTF-8"):
data.table::fread utils::read.tablebase::scancolbycol::cbc.read.table但没有效果.
我的R.version:
> R.version
_
platform x86_64-w64-mingw32
arch x86_64
os mingw32
system x86_64, mingw32
status
major 3
minor 0.3
year 2014
month 03
day 06
svn rev 65126
language R
version.string R version 3.0.3 (2014-03-06)
nickname Warm Puppy
Run Code Online (Sandbox Code Playgroud)
我的会话信息:
> sessionInfo()
R version 3.0.3 (2014-03-06)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=Polish_Poland.1250 LC_CTYPE=Polish_Poland.1250 LC_MONETARY=Polish_Poland.1250
[4] LC_NUMERIC=C LC_TIME=Polish_Poland.1250
base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] data.table_1.9.2 colbycol_0.8 filehash_2.2-2 rJava_0.9-6
loaded via a namespace (and not attached):
[1] plyr_1.8.1 Rcpp_0.11.1 reshape2_1.2.2 stringr_0.6.2 tools_3.0.3
Run Code Online (Sandbox Code Playgroud)
gag*_*ews 47
如果字符串具有"本机编码"标记(在您的情况下为CP-1250)或者它是ASCII格式,则该Encoding函数返回unknown.要区分这两种情况,请致电:
library(stringi)
stri_enc_mark(poli.dt$word)
Run Code Online (Sandbox Code Playgroud)
要检查每个字符串是否包含有效的UTF-8字节序列,请调用:
all(stri_enc_isutf8(poli.dt$word))
Run Code Online (Sandbox Code Playgroud)
如果不是这样,那么您的文件根本不是UTF-8.
我怀疑你在读取文件时没有指示R它确实是UTF-8(它应该足以查看poli.dt$word验证这个语句的内容).如果我的猜测是真的,请尝试:
read.csv2(file("filename", encoding="UTF-8"))
Run Code Online (Sandbox Code Playgroud)
要么
poli.dt$word <- stri_encode(poli.dt$word, "", "UTF-8") # re-mark encodings
Run Code Online (Sandbox Code Playgroud)
如果data.table仍然抱怨"混合"编码,您可能希望音译非ASCII字符,例如:
stri_trans_general("Za?ó?? g??l? ja??", "Latin-ASCII")
## [1] "Zazolc gesla jazn"
Run Code Online (Sandbox Code Playgroud)
我自己找不到类似问题的解决方案。我无法将txt文件中的未知编码字符转换回R中更易于管理的内容。
因此,由于相同的编码方式(拉丁设置中的“ X”和希腊语设置中的“ X”),我在同一数据集中出现多次相同字符的情况。但是,txt保存操作保留了编码差异---当然做得很好。
尝试上述某些方法,没有任何效果。问题已得到很好的描述:“无法将ASCII与UTF-8区别开,即使将其设置,该位也不会停留”。
一个好的解决方法是“将data.frame导出到CSV临时文件,然后使用data.table :: fread()重新导入,并指定Latin-1作为源编码。” 。
复制/复制上述来源提供的示例:
package(data.table)
df <- your_data_frame_with_mixed_utf8_or_latin1_and_unknown_str_fields
fwrite(df,"temp.csv")
your_clean_data_table <- fread("temp.csv",encoding = "Latin-1")
Run Code Online (Sandbox Code Playgroud)
希望对您有所帮助。
| 归档时间: |
|
| 查看次数: |
30347 次 |
| 最近记录: |