在R中获取不带扩展名的文件名


71

我有一个档案

ABCD.csv 

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

如何提取.csv

Answers:


128

有一个file_path_sans_ext标准安装工具包中的内置组件,可抓取不带扩展名的文件。

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

8
任何需要有关此功能和类似功能的详细信息的人,请看一下?tools::file_ext
thelatemail 2015年

36

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"

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

17

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

1
是的,它也会删除。为什么您还需要字面意义上.的“\\.可能”之后.foo..
akrun

您当然是对的,这是一个错字。我的错。现在,我不能再对其进行编辑。
Stephanmg

1
@stephanmg可能会出现诸如foo.不确定如何处理这些
极端

1
@stephanmg我会说正则表达式将是更自定义的情况,即它不能应用于所有一般情况。假设如果他/她只会.<word>在最后使用OP指导并且没有其他情况,那么这将起作用
akrun

1
好吧,我认为那很好。
stephanmg

4

您也可以尝试以下操作:

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

#[1] "ABCD"

例如,这在文件列表的情况下也会很有帮助

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


2

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

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

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

会让你离开foo.bar.baz


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

0

加载所需的库:

> library(stringr)

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

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

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

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

编辑@ U-10-Forward:

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

正则表达式明智地意味着:

  • ()=组

  • 。* =任意次数除换行符外的任何单个字符

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

  • 。* =任意次数的任意字符

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.