gpt4 book ai didi

r - 在 R 中从列表转换为 data.frame 时,utf-8 字符会丢失

转载 作者:行者123 更新时间:2023-12-04 12:30:51 25 4
gpt4 key购买 nike

我在 Windows 7 64 位上使用 R 3.2.0 和 RStudio 0.98.1103。我电脑的 Windows“区域和语言设置”是英语(美国)。

出于某种原因,当我从网络读取 utf-8 编码的 XML 文件时,以下代码将文本“Koryčany nad přehradou”中的捷克字符“č”和“ř”替换为“c”和“r”,解析将 XML 文件转换为列表,并将列表转换为 data.frame。

library(XML)
url <- "http://hydrodata.info/chmi-h/cuahsi_1_1.asmx/GetSiteInfoObject?site=CHMI-H:1263&authToken="
doc <- xmlRoot(xmlTreeParse(url, getDTD=FALSE, useInternalNodes = TRUE))
infoList <- xmlToList(doc[[2]][[1]])
siteName <- infoList$siteName

#this still displays correctly "Koryčany nad přehradou"
print(siteName)

#make a data.frame from the list item. I suspect here is the problem.
df <- data.frame(name=siteName, id=1)

#now the Czech characters are lost. I see only "Korycany nad prehradou"
View(df)

write.csv(df,"test.csv")
#the test.csv file also contains "Korycany nad prehradou"
#instead of "Koryčany nad přehradou"

问题是什么?如何让 R 使用所有 utf-8 特殊字符正确显示我的 data.frame 并保存 .csv 文件而不会丢失“č”和“ř”捷克字符?

最佳答案

这不是一个完美的答案,但以下解决方法为我解决了这个问题。我试图了解行为或 R,并制作示例,以便我的 R 脚本在 Windows 和 Linux 平台上产生相同的结果:

(1)从网上获取UTF-8格式的XML数据

library(XML)
url <- "http://hydrodata.info/chmi-h/cuahsi_1_1.asmx/GetSiteInfoObject?site=CHMI-H:1263&authToken="
doc <- xmlRoot(xmlTreeParse(url, getDTD=FALSE, useInternalNodes = TRUE))
infoList <- xmlToList(doc[[2]][[1]])
siteName <- infoList$siteName

(2) 打印出网上的文字:编码为UTF-8,在R控制台中显示也是正确的,在Windows上使用捷克语和英语语言环境:
> Sys.getlocale(category="LC_CTYPE")
[1] "English_United States.1252"
> print(siteName)
[1] "Koryčany nad přehradou"
> Encoding(siteName)
[1] "UTF-8"
>

(3) 尝试创建并查看一个data.frame。这有问题。 data.frame 在 RStudio View 和控制台中都显示不正确:
df <- data.frame(name=siteName, id=1)
df
name id
1 Korycany nad prehradou 1

(4) 尝试使用矩阵代替。令人惊讶的是,矩阵在 R 控制台中正确显示。
m <- as.matrix(df)
View(m) #this shows incorrectly in RStudio
m #however, this shows correctly in the R console.
name id
[1,] "Koryčany nad přehradou" "1"

(5) 更改语言环境。如果我使用的是 Windows,请将语言环境设置为捷克语。如果我使用的是 Unix 或 Mac,请将语言环境设置为 UTF-8。注意:当我在 RStudio 中运行脚本时,这会出现一些问题,显然 RStudio 并不总是立即对 Sys.setlocale 命令使用react。
#remember the original locale.
original.locale <- Sys.getlocale(category="LC_CTYPE")

#for Windows set locale to Czech. Otherwise set locale to UTF-8
new.locale <- ifelse(.Platform$OS.type=="windows", "Czech_Czech Republic.1250", "en_US.UTF-8")
Sys.setlocale("LC_CTYPE", new.locale)

(7) 将数据写入文本文件。重要提示:不要使用 write.csv而是使用 write.table .当我的语言环境是 Czech在我的英文 Windows 上,我必须使用 fileEncoding="UTF-8"write.table .现在文本文件在 Notepad++ 和Excel中正确显示。
write.table(m, "test-czech-utf8.txt", sep="\t", fileEncoding="UTF-8")

(8) 将locale设置回原来的
Sys.setlocale("LC_CTYPE", original.locale)

(9) 尝试将文本文件读回 R。注意:如果我读文件,我必须设置 encoding参数(不是文件编码!)。从文件中读取的 data.frame 的显示仍然不正确,但是当我转换我的 data.frame 时到 matrix捷克语 UTF-8 字符被保留:
data.from.file <- read.table("test-czech-utf8.txt", sep="\t", encoding="UTF-8")
#the data.frame still has the display problem, "č" and "ř" get "lost"
> data.from.file
name id
1 Korycany nad prehradou 1

#see if a matrix displays correctly: YES it does!
matrix.from.file <- as.matrix(data.from.file)
> matrix.from.file
name id
1 "Koryčany nad přehradou" "1"

所以吸取的教训是我需要转换我的 data.framematrix ,将我的语言环境设置为 Czech (在 Windows 上)或到 UTF-8 (在 Mac 和 Linux 上)在我将带有捷克字符的数据写入文件之前。那我写文件的时候一定要确定 fileEncoding必须设置为 UTF-8。另一方面,当我稍后阅读文件时,我可以继续在英语语言环境中工作,但是在 read.table 中。我必须设置 encoding="UTF-8" .

如果有人有更好的解决方案,我会欢迎您的建议。

关于r - 在 R 中从列表转换为 data.frame 时,utf-8 字符会丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29957678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com