【问题标题】:Handling 'Combining Diacritical Marks' in filenames with R使用 R 处理文件名中的“组合变音符号”
【发布时间】:2018-03-09 01:03:03
【问题描述】:

我有数百个带有'Combining Diacritical Marks' (Unicode General Category Mn) 的文件名。当我使用 list.files() 函数时,我无法让 R 读取或打开这些文件,因为 R 将带有“组合变音符号”(例如 \u301\u308)的文件名转换为 \xb4\xa8 , 分别。结果是系统找不到不同的文件名。如何防止 R 替换这些字符?

在文件名列表上应用 gsub() 函数以用组合的重音替换独立的重音(即 filenames <- gsub("A´", "Á", filenames) 将“A´”更改为单个 unicode 字符“Á”,而不是双 unicode字符“Á”不是同一个东西,因此系统找不到具有该名称的文件。(粘贴到文本编辑器中查看它们不一样。)

即使将双 unicode 字符“Á”传递给 print("Á") 并从控制台运行也会返回单个 unicode 字符“Á”。但是,print("A\u301") 返回正确的双 unicode 字符“Á”。而gsub("A´", "A\u301", "A´") 返回"A´"

看来stringi::stri_trans_nf*() 函数是一个可能的解决方案,但我不确定如何使用list.files()gsub() 函数返回一个文件名列表,然后系统可以正确解释这些文件名。

【问题讨论】:

    标签: r unicode


    【解决方案1】:

    自己解决了。

    使用以下方法将文件名的字符向量更改为正确的系统表示,其中包含“组合急性口音”\u301 和“组合分音符号”\u308

    oldnames <- list.files(pattern = "*.pdf", full.names = TRUE, recursive = TRUE)
    library(stringi)
    oldnames <- unlist(lapply(oldnames, stri_replace_all_regex, "´", "\u301"))
    oldnames <- unlist(lapply(oldnames, stri_replace_all_regex, "¨", "\u308"))
    

    然后创建一个没有组合变音符号的文件名的新字符向量。

    newnames <- oldnames
    newnames <- unlist(lapply(newnames, stri_replace_all_regex, "\u301", ""))
    newnames <- unlist(lapply(newnames, stri_replace_all_regex, "\u308", ""))
    

    然后用新文件名重命名文件。

    file.rename(oldnames,newnames)
    

    至少现在我可以像往常一样处理 R 中的文件了。

    【讨论】:

      猜你喜欢
      • 2012-11-08
      • 2015-08-13
      • 1970-01-01
      • 2014-07-15
      • 2018-01-31
      • 2021-11-06
      • 1970-01-01
      • 2014-09-10
      • 2016-08-11
      相关资源
      最近更新 更多