如何在 R 中打开下载的 .csv 文件,该文件同时包含正确的重音字符和错误的重音字符?

How do I open in R a downloaded .csv file that contains both correct accented characters and faulty ones?

提问人:Monelisa 提问时间:9/4/2023 最后编辑:desertnautMonelisa 更新时间:9/6/2023 访问量:54

问:

我有一个 .csv 文件,其中包含正确和误读的重音字符。例如,第一行我有“Veríssimo”,第二行我有“VirgÃ-nia”(应该是 Virgínia)。 如果我什么都不做,它会打开文件,并拼写错误“Virgínia”。如果我尝试我所知道的更正方法之一,例如使用 UTF-8 编码保存文件,那么“Veríssimo”拼写错误。

在 R 中,我尝试过:它检测 UTF-8 编码并以拼写错误的“Veríssimo”打开。dados_MG2 <- read_csv("dados_MG.csv")

dados_MG <- read_csv("Dados/extra/dados_MG.csv", locale = locale(encoding = "ISO-8859-1"))我尝试强制使用不同的编码,有了它,“Veríssimo”拼写正确,但“Virgínia”不是。

这是我的数据集的链接:https://github.com/elisa-fink/THM

r csv utf-8 非 ASCII 字符

评论


答:

2赞 Robert Hacken 9/4/2023 #1

您可以使用查找具有无效 UTF-8 字符的字符串,并将其替换为使用 ISO-8859-1 编码读取的字符串:nchar

dados_MG <- read_csv('dados_MG.csv')
dados_MG.iso <- read_csv('dados_MG.csv', locale = locale(encoding = 'ISO-8859-1'))

not.utf <- is.na(nchar(dados_MG$DS_NOME, allowNA=T))
dados_MG$DS_NOME[not.utf] <- dados_MG.iso$DS_NOME[not.utf]

grep('^Ver.ss|^Virg.ni', dados_MG$DS_NOME, value=T)
# [1] "Veríssimo" "Virgínia" 

一个更简单的变体,只有一次读取 CSV 文件(受 @rps1227 的回答启发):

dados_MG <- read_csv('dados_MG.csv')
not.utf <- is.na(nchar(dados_MG$DS_NOME, allowNA=T))
dados_MG$DS_NOME[not.utf] <- 
  iconv(dados_MG$DS_NOME[not.utf], from='ISO-8859-1', to='UTF-8')
2赞 rps1227 9/4/2023 #2

另一个选项,只需要读取文件一次,并用于转换原始文件中未以 UTF-8 编码的名称:base::iconv()

dados_MG <- read_csv("./dados_MG.csv") %>%
  mutate(encode_issues = is.na(unlist(lapply(DS_NOME, nchar, allowNA = TRUE)))) %>%
  mutate(DS_NOME = if_else(encode_issues,
                           iconv(DS_NOME, from = "ISO-8859-1",
                                 to = "UTF-8"),
                           DS_NOME)) %>%
  select(-encode_issues)

grep('^Ver.ss|^Virg.ni', dados_MG$DS_NOME, value=T)
#> [1] "Veríssimo" "Virgínia"

创建于 2023-09-04 使用 reprex v2.0.2