阅读希伯来语read.csv(混合问题)

yi0zb3m4  于 2023-02-27  发布在  其他
关注(0)|答案(1)|浏览(109)

我有1000 csv文件,其中包含希伯来语的量。
我试图将它们导入到R中,但在将希伯来语读入程序时出现了问题。
当使用这个,我得到arount 80%的文件与正确的希伯来语,但其他20%没有:

data_lst <- lapply(files_to_read,function(i){
  read.csv(i, encoding = "UTF-8")
})

当使用这个,我得到了其他20%的权利,但80%的工作之前不工作在这里:

data_lst <- lapply(files_to_read,function(i){
  read.csv(i, encoding = 'utf-8-sig')
})

我无法使用库(readr)中的read_csv,必须使用read.csv格式。
谢谢你的帮助!

tvokkenx

tvokkenx1#

听起来你有两种不同的文件编码,utf-8和utf-8-sig,后者在开头有一个Byte Order Mark0xef, 0xbb, 0xbf表示编码。
我将iris数据集以两种编码方式写入csv-唯一的区别是第一行。

UTF-8编码格式:
sepal.length,sepal.width,petal.length,petal.width,species
UTF-8-签名:
sepal.length,sepal.width,petal.length,petal.width,species

在您的例子中,听起来R没有正确检测编码,但是使用encoding="utf-8"对某些文件有效,而encoding="utf-8-sig"对其他文件有效,在我看来,自然的操作过程是读取第一行,看看它是否在开始时具有该模式:

BOM_pattern <- "^"

encodings <- vapply(
    files_to_read,
    \(file) {
        line <- readLines(file, n = 1L, encoding = "utf-8")
        ifelse(grepl(BOM_pattern, line), "utf-8-sig", "utf-8")
    },
    character(1)
)

这将返回一个(命名的)字符向量c("utf-8", "utf-8-sig"),然后您可以为read.csv提供编码:

data_lst <- Map(
    \(file, encoding) read.csv(file, encoding = encoding),
    files_to_read,
    encodings
)

这应该读取具有正确编码的每个 Dataframe ,并将它们存储在列表data_lst中。

    • 编辑**

由于从右到左的阅读顺序,可能需要额外考虑。R是否将插入符号(^)用作句子开头分隔符取决于字符串中的所有字母是否都是希伯来字母。例如:

pattern  <- "^ז"
grepl(pattern, "זה משפט בעברית") # TRUE
grepl(pattern, "AAA זה משפט בעברית") # FALSE

这对希伯来语的普通用户来说可能是显而易见的,但对我来说是新的,可能会导致额外的复杂性。如果模式不总是在你认为应该识别的时候被识别,你可以从模式中删除脱字符:

BOM_pattern <- ""

唯一的例外情况是,您希望在其中一个列名中看到该字符串。

相关问题