【问题标题】:Get filename without extension in R在R中获取不带扩展名的文件名
【发布时间】:2015-05-20 18:14:30
【问题描述】:

我有一个文件

ABCD.csv 

.csv前面的长度不固定,可以任意长度变化。

如何提取.csv之前的部分。

【问题讨论】:

    标签: r r-faq


    【解决方案1】:

    标准安装 tools 包中有一个内置的file_path_sans_ext,它可以抓取没有扩展名的文件。

    tools::file_path_sans_ext("ABCD.csv")
    ## [1] "ABCD"
    

    【讨论】:

    • 任何想了解有关此功能和类似功能的详细信息的人,请查看?tools::file_ext
    • 经过测试,我认为basename()中的文件路径最好是file_path_sans_ext(basename(filepath))
    【解决方案2】:

    basename 还将删除指向该文件的路径。使用这个正则表达式,任何扩展都将被删除。

    filepath <- "d:/Some Dir/ABCD.csv"
    sub(pattern = "(.*)\\..*$", replacement = "\\1", basename(filepath))
    
    # [1] "ABCD"
    

    或者,按照 Tyler Rinker 的建议使用 file_path_sans_ext

    file_path_sans_ext(basename(filepath))
    
    # [1] "ABCD"
    

    【讨论】:

    • 特殊情况:具有“多个扩展名”的文件,例如“ABCD.txt.csv”(是的,确实如此),然后只需添加一个“?”使表达式不贪婪:sub(pattern = "(.*?)\\..*$", replacement = "\\1", basename(filepath))
    【解决方案3】:

    您可以使用subsubstr

    sub('\\.csv$', '', str1) 
    #[1] "ABCD"
    

    substr(str1, 1, nchar(str1)-4)
    #[1] "ABCD"
    

    使用@JasonV 帖子中的“file_path”

    sub('\\..*$', '', basename(filepath))
    #[1] "ABCD"
    

    或者

    library(stringr)
    str_extract(filepath,  perl('(?<=[/])([^/]+)(?=\\.[^.]+)'))
    #[1] "ABCD"
    

    数据

    str1 <- 'ABCD.csv'
    

    【讨论】:

    • 是的,它也会删除。为什么在\\. 之后需要. 是否也可以是. 字面意思,即foo..
    • 您当然是对的,这是一个错字。我的错。现在我不能再编辑了。
    • @stephanmg 可能存在像foo. 这样的极端情况,不知道如何处理
    • @stephanmg我会说正则表达式将是更自定义的情况,即它不能应用于所有一般情况。假设如果 OP 提到他/她最后只会有 .&lt;word&gt; 并且没有其他情况,这会起作用
    • 好吧,我觉得这样就好了。
    【解决方案4】:

    你也可以试试这个:

    data <- "ABCD.csv"
    gsub(pattern = "\\.csv$", "", data)
    
    #[1] "ABCD"
    

    这对于文件列表也很有帮助,比如说

    data &lt;- list.files(pattern="\\.csv$") ,使用该代码将删除列表中所有文件的扩展名。

    【讨论】:

      【解决方案5】:

      如果您的文件名具有多个(可能的扩展名)并且您只想删除最后一个扩展名,您可以尝试以下操作。

      考虑文件名foo.bar.baz.txt这个

      sub('\\..[^\\.]*$', '', "foo.bar.baz.txt")
      

      会给你留下foo.bar.baz

      【讨论】:

        【解决方案6】:

        fs::path_ext_remove()"删除最后一个扩展并返回路径的其余部分"。

        fs::path_ext_remove(c("ABCD.csv", "foo.bar.baz.txt", "d:/Some Dir/ABCD.csv"))
        
        # Produces: [1] "ABCD"             "foo.bar.baz"      "D:/Some Dir/ABCD"
        

        【讨论】:

          【解决方案7】:

          这是一个适用于压缩和多个文件的实现:

          remove.file_ext <- function(path, basename = FALSE) {
            out <- c()
            for (p in path) {
              fext <- file_ext(path)
              compressions <- c("gzip", "gz", "bgz", "zip")
              areCompressed <- fext %in% compressions
              if (areCompressed) {
                ext <- file_ext(file_path_sans_ext(path, compression = FALSE))
                regex <- paste0("*\\.",ext,"\\.", fext,"$")
              } else {
                regex <- paste0("*\\.",fext,"$")
              }
              new <- gsub(pattern = regex, "", path)
              out <- c(out, new)
            }
            return(ifelse(basename, basename(out), out))
          }
          

          【讨论】:

            【解决方案8】:

            加载所需的库:

            > library(stringr)
            

            从正则表达式中提取所有匹配项:

            > str_match("ABCD.csv", "(.*)\\..*$")
                 [,1]       [,2]  
            [1,] "ABCD.csv" "ABCD"
            

            只返回结果的第二部分,对应于匹配文件名的组:

            > str_match("ABCD.csv", "(.*)\\..*$")[,2]
            [1] "ABCD"
            

            编辑@U-10-Forward:

            与其他答案的原理基本相同。只是我发现这个解决方案更强大。

            正则表达式意味着:

            • () = 组

            • .* = 除换行符以外的任意单个字符,任意次数

            • // 是转义符号,因此是 //。字面意思是“。”

            • .* = 任意字符多次重复

            • $ 表示应该在输入字符串的末尾

            这样的逻辑是它将返回“。”之前的组。后跟字符串末尾的一组字符(在这种情况下等于文件扩展名)。

            【讨论】:

              猜你喜欢
              • 2011-06-15
              • 2011-10-02
              • 2011-05-25
              • 1970-01-01
              • 2015-05-13
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多