【问题标题】:Is there a way to load in multiple .txt files and list them after so the encoding can be changed?有没有办法加载多个 .txt 文件并在之后列出它们以便可以更改编码?
【发布时间】:2021-06-03 18:11:35
【问题描述】:

我正在尝试将多个 .txt 文件加载到语料库中。我已经设置了工作目录,然后有以下内容来加载文件:

filenames <- list.files(getwd(),pattern="*.txt", full.names=FALSE)

问题是,有些文本文件名有特殊字符(它们是人名),我找不到用list.files() 将编码更改为UTF-8 的方法,我不确定如何在没有list.files() 的情况下加载许多 .txt 文件。在这种情况下,我也无法删除特殊字符。

有什么建议吗?提前致谢!

编辑:在 Windows 中工作

【问题讨论】:

  • 也许其中一些技巧会有所帮助stackoverflow.com/a/23699701/10276092
  • filenames 返回什么?还是list.files 返回错误?
  • 您使用的是哪个操作系统?窗户?
  • 也许Encoding(filenames) &lt;- "UTF-8" 能帮上忙?

标签: r file encoding txt


【解决方案1】:

如果编码错误,模式参数将不起作用。使用list.files() 而不使用pattern=...,您至少可以从错误编码的文件名中获取字符串,然后您可以在R 中使用并可能修复这些字符串。

这是一个最小的演示示例(需要convmv 系统命令来设置测试用例)

    dir.create( wd <- tempfile() )
    setwd(wd)

    convmv <- Sys.which("convmv")
    if( convmv == "" )
        stop("Need the convmv available to continue")

    f1 <- "æøå.txt"
    cat( "foo\n", file=f1 )
    system2( convmv, args=c("-f", "utf8", "-t", "latin1", "--notest", f1) )

    f2 <- "ÆØÅ.txt"
    cat( "bar\n", file=f2 )

    plain.list.files <- list.files()
    stopifnot( length( plain.list.files ) == 2 )

    with.pattern.list.files <- list.files( pattern="\\.txt" )
    stopifnot( length( with.pattern.list.files ) == 1 )

可以修复字符集,但我不确定您此时是否在问这个问题。

编辑:实际使用或修复这些文件名:

现在您可以阅读这些文件,它们可能有多糟糕,如果您知道它们是 latin1,例如,以下内容可能会有所帮助。具有讽刺意味的是,detect_str_enc 并不正确(而且我没有找到好的替代方案),但是如果您知道任何不是 ASCII 或 UTF-8 的文件名都是 latin1,那么这可能是一个适合您的解决方法:

    library(uchardet)

    hard.coded.encoding <- "latin1"

    nice.filenames <- sapply( plain.list.files, function(fname) {
        if( !detect_str_enc(fname) %in% c("ASCII","UTF-8") ) {
            Encoding(fname) <- hard.coded.encoding
        }
        return( fname )
    })

    ## Now its presumably safe to look for our pattern:
    i.txt <- grepl( "\\.txt$", nice.filenames )

    ## And we can now work with the files and present them nicely:

    file.data <- lapply( plain.list.files[i.txt], function(fname) {
        ## Do what you want to do with the file here:
        readLines( fname )
    })
    names(file.data) <- nice.filenames[i.txt]

【讨论】:

  • 我认为这个解决方案不会有帮助:在支持 convmv 的系统上,R 已经支持 UTF-8 文件名就好了。问题是 OP 使用的是 Windows,其中文件名内部为 UTF-16(有一些我不记得的警告),或者文件名一开始就不是有效的 UTF-8(这在某些文件系统上是可能的)。
  • 我也这么认为,我并不是说 convmv 会帮助他,我用它来演示list.files() 将如何列出错误编码的文件名,其中list.files( pattern="txt" ) 带有模式参数, 将不会。这为 OP 提供了一种首先列出文件的方法,而这是他没有的。同样,convmv 只是设置演示测试用例,而不是提供解决方案。
  • 哦,这很聪明,没注意到。
  • 非常感谢您的 cmets,他们对继续进行故障排除很有帮助。删除pattern 确实允许我将它们加载到语料库中,但后来我得到了“无法打开文件:没有这样的文件或目录”错误,所以我认为最终的问题一定是别的。这些文件出现在环境中,但我无法再对它们做任何事情。
  • 这是在linux系统上吗?如果是这样,是否可以选择使用 convmv 命令修复所有文件?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
  • 2012-04-12
  • 2022-12-04
  • 2021-09-09
  • 2020-12-28
  • 2018-04-18
  • 2018-06-06
相关资源
最近更新 更多