3

我正在努力将对话的文字记录读入 R 中。但是我遇到了特殊字符,如弯引号 en 和 em 破折号等。通常,我首先将 Microsoft 产品中的这些特殊字符替换为replace. 通常我用纯文本替换特殊字符,但在某些情况下希望用其他字符替换它们(即我用 {} 替换“”)。这是乏味的,并不总是彻底的。如果我可以按原样将成绩单读入 R,然后使用 Encoding 将它们的编码转换为可识别的 unicode 格式,我可以将gsub它们取出并用纯文本版本替换它们。但是,该文件以某种我不理解的方式读入。这是我的数据可能看起来的 xlsx:

http://dl.dropbox.com/u/61803503/test.xlsx

这是 .xlsx 文件中的内容

text                              num
“ ” curly quotes                    1
en dash (–) and the em dash (—)     2
‘ ’ curly apostrophe-ugg            3
…  ellipsis are uck in R            4

这可以读入R:

URL <- "http://dl.dropbox.com/u/61803503/test.xlsx"
library(gdata) 
z <- read.xls(URL, stringsAsFactors = FALSE) 

结果是:

                                 text num
1                “ †curly quotes    1
2 en dash (–) and the em dash (—)   2
3        ‘ ’ curly apostrophe-ugg   3
4          …  ellipsis are uck in R   4

所以我尝试使用Encoding转换为Unicode:

iconv(z[, 1], "latin1", "UTF-8")

这给出了:

[1] "â\u0080\u009c â\u0080\u009d curly quotes"                "en dash (â\u0080\u0093) and the em dash (â\u0080\u0094)"
[3] "â\u0080\u0098 â\u0080\u0099 curly apostrophe-ugg"        "â\u0080¦  ellipsis are uck in R"     

这使得 gsubing 不太有用。

我该怎么做才能将这些特殊字符转换为可区分的 unicode,以便我可以适当地将它们 gsub 出来?更明确地说,我希望z[1, 1]阅读:

\u201C 2\u01D curly quotes

为了更清楚我想要的结果,我将从维基百科之类的页面中抓取表格:http ://en.wikipedia.org/wiki/Quotation_mark_glyphs并使用 unicode 参考图表适当地替换字符。所以我需要字符是 unicode 或某种标准格式,我可以系统地检查并替换字符。也许它已经是,我想念它。

PS 我不将文件保存为 .csv 或纯文本,因为特殊字符被替换为,?因此如果您有更好的选择,read.xls 我不会附加到任何特定的文件读取方法(即) read.xls.

4

2 回答 2

9

也许这会有所帮助(我明天可以使用 Windows 机器,如果 SO 没有先给你答案,我可能会在那时更多地使用它)。

在我的 Linux 系统上,当我执行以下操作时:

iconv(z$text, "", "cp1252")

我得到:

[1] "\x93 \x94 curly quotes"                "en dash (\x96) and the em dash (\x97)"
[3] "\x91 \x92 curly apostrophe-ugg"        "\x85  ellipsis are uck in R"  

这不是 UTF,而是(我相信)ISO 十六进制实体。不过,如果您也能够达到这一点,那么您应该能够使用gsub您打算使用的方式。

有关转换,请参阅此页面(特别是保留部分)。

更新

您也可以尝试转换为没有这些字符的编码,例如 ASCII 并设置sub"byte". 在我的机器上,这给了我:

iconv(z$text, "", "ASCII", "byte")
# [1] "<e2><80><9c> <e2><80><9d> curly quotes"               
# [2] "en dash (<e2><80><93>) and the em dash (<e2><80><94>)"
# [3] "<e2><80><98> <e2><80><99> curly apostrophe-ugg"       
# [4] "<e2><80><a6>  ellipsis are uck in R"   

它很丑,但它UTF-8(e2, 80, 9c)是一个正确的大引号(我相信每个字符都是一组用尖括号括起来的三个值)。您可以在此站点上找到转换,您可以在其中按标点符号名称进行搜索。

于 2012-08-15T17:55:09.340 回答
1

尝试

> iconv(z, "UTF-8", "UTF-8") 
[1] "c(\"“—” curly quotes\", \"en dash (–) and the em dash (—)\", \"‘—’ curly apostrophe-ugg\", \"…  ellipsis are uck in R\")"
[2] "c(1, 2, 3, 4)"  

windows的编码问题很大。也许您可以查看http://www.vmware.com/products/player/并运行 linux。

这适用于我的 Windows 盒子。最初的输入和你一样。你可能会有不一样的体验。

于 2012-08-15T16:57:55.760 回答