我正在通过emacs解析从互联网下载到R盘中的文本。下载是由使用不同字符编码的不同机器完成的。由于字符编码差异,我无法使正则表达式在文本中命名列表(它们是西班牙语名称,带有重音元音)。任何帮助理解一般的字符编码,特别是它对R的应用,将不胜感激。
我找到了关于python here的编码的很好的教程,但对于R没有任何帮助。我也有Jeff Friedl的掌握正则表达式书,但没有找到答案。
这是我的语言环境的摘要:
> Sys.getlocale()
[1] "LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8;LC_COLLATE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_MESSAGES=en_US.UTF-8;LC_PAPER=en_US.UTF-8;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_US.UTF-8;LC_IDENTIFICATION=C"
我从阅读文字开始。第一个实例是UTF-8,第二个是Latin-1(我无法确定这是我将解析的数千个文本文件的先验)。
info1 <- readLines( con= "~/data/file1.txt" , encoding = "utf8" ) ## works for i = 1
info2 <- readLines( con= "~/data/file2.txt" , encoding = "latin1" ) ## works for i = 2
info1w <- readLines( con= "~/data/file1.txt" , encoding = "latin1" ) ## wrong encoding
我将寻找JiménezEsquivelLaura这个名字(我希望你机器上的重音三个字显示出来 - 它在我的机器中 - 以及下面代码中的一些特殊字符)
> info1[grep(info, pattern="nez Esquivel", perl=TRUE)]
[1] "<td width=\"400\" class=\"linkVerde\" >Jiménez Esquivel Laura</a></span></td>"
> info2[grep(info, pattern="nez Esquivel", perl=TRUE)]
[1] "<td width=\"400\" class=\"linkVerde\" >Jiménez Esquivel Laura</a></span></td>"
> info1w[grep(info, pattern="nez Esquivel", perl=TRUE)]
[1] "<td width=\"400\" class=\"linkVerde\" >Jiménez Esquivel Laura</a></span></td>"
如果我要搜索带重音的e(我为此示例中的grep搜索字符串故意删除了它),它将不会命名为info1w中的名称。如何处理成千上万的文件,而忽略了先验编码的字符?
答案 0 :(得分:1)
感谢Roman Luštrik提供了一个启发解决方案的示例。我想到了一个应该总是出现在日志名单中并且有特殊字符的名字(Martínez)。我读取每个文件以递归方式更改字符编码,搜索所选名称。录制未命中表示哪些文件未正确编码,将它们传递到下一个循环。在我的情况下,两次运行就足够了,但是其他编码可以添加到下面的代码中。
encod <- rep(NA, I)
for (i in 1:I){
info <- readLines( con=filenames[i] , encoding = "utf8" )
encod[i] <- ifelse( length(grep(info, pattern="Martínez", perl=TRUE))>0, "utf8", NA) # the name should appear in every file
}
for(i in which(is.na(encod)==TRUE)){
info <- readLines( con=filenames[i] , encoding = "latin1" )
encod[i] <- ifelse( length(grep(info, pattern="Martínez", perl=TRUE))>0, "latin1", NA) # the name should appear in every file
}
当对象编码没有剩余的NA时,过程结束。
> which(is.na(encod)==TRUE)
integer(0)
最后,对象编码可以指定正确的字符编码
for (i in 1:I){
info <- readLines( con=filenames[i] , encoding = encod[i] )
}