获取R中没有扩展名的文件名

时间:2015-03-18 04:09:12

标签: r

我有点像R新手,因此有疑问。

我有一个文件

ABCD.csv 

.csv之前的长度不固定,并且可以变化为任何长度。 如何在.csv之前提取部分。

8 个答案:

答案 0 :(得分:82)

标准安装工具包内置了file_path_sans_ext,可以抓取没有扩展名的文件。

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

答案 1 :(得分:19)

basename也会删除指向该文件的路径。使用此正则表达式,任何扩展名都将被删除。

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

# [1] "ABCD"

或者,使用file_path_sans_ext作为Tyler Rinker建议:

file_path_sans_ext(basename(filepath))

# [1] "ABCD"

答案 2 :(得分:11)

您可以使用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'

答案 3 :(得分:2)

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

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

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

将留下foo.bar.baz

答案 4 :(得分:1)

你也可以试试这个:

data <- "ABCD.csv"
gsub(pattern = "\\.csv$", "", data)

#[1] "ABCD"

这也适用于文件列表,例如

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

答案 5 :(得分:1)

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

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))
}

答案 6 :(得分:0)

加载所需的库:

> library(stringr)

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

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

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

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

@ U-10-转发的编辑:

与其他答案基本相同。只是我发现此解决方案更可靠。

正则表达式明智的意思是:

  • ()=组

  • 。* =除换行符之外的任意单个字符,次数不限

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

  • 。* =任意次数再次出现任何字符

  • $意味着应该在输入字符串的末尾

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

答案 7 :(得分:0)

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"