提问人:Matrix.cursor 提问时间:3/18/2015 最后编辑:AndrewGBMatrix.cursor 更新时间:5/24/2022 访问量:92207
在 R 中获取不带扩展名的文件名
Get filename without extension in R
答:
您可以使用 或sub
substr
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..
foo.
.<word>
标准安装工具包中有一个内置功能,可以获取不带扩展名的文件。file_path_sans_ext
tools::file_path_sans_ext("ABCD.csv")
## [1] "ABCD"
评论
?tools::file_ext
basename()
file_path_sans_ext(basename(filepath))
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"
评论
sub(pattern = "(.*?)\\..*$", replacement = "\\1", basename(filepath))
您也可以尝试以下操作:
data <- "ABCD.csv"
gsub(pattern = "\\.csv$", "", data)
#[1] "ABCD"
在文件列表的情况下,这也会有所帮助,比如说
data <- list.files(pattern="\\.csv$")
,使用该代码将删除列表中所有文件的扩展名。
下面是一个适用于压缩和多个文件的实现:
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))
}
加载所需的库:
> library(stringr)
从正则表达式中提取所有匹配项:
> str_match("ABCD.csv", "(.*)\\..*$")
[,1] [,2]
[1,] "ABCD.csv" "ABCD"
仅返回结果的第二部分,该部分对应于与文件名匹配的组:
> str_match("ABCD.csv", "(.*)\\..*$")[,2]
[1] "ABCD"
@U-10-Forward 的 EDIT:
它与其他答案的原理基本相同。只是我发现这个解决方案更强大。
正则表达式意味着:
() = 组
.* = 除换行符外的任何单个字符,任意次数
是转义符号,因此 //。字面意思是“”。
.* = 任意字符,再重复任意次数
$ 表示应位于输入字符串的末尾
逻辑是,它将返回字符串末尾的“.”前面的组,后跟一组字符(在本例中等于文件扩展名)。
如果您的文件名包含多个(可能的扩展名),并且只想去掉最后一个扩展名,则可以尝试以下操作。
考虑文件名foo.bar.baz.txt
sub('\\..[^\\.]*$', '', "foo.bar.baz.txt")
会给你留下.foo.bar.baz
fs::p ath_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"
上面的答案很好,但我感兴趣的是哪个是一次处理数百万条路径的最快方法。似乎通过这个 SO 问题使用是将文件名从路径中取出的最快方法。然后比较上述三种方法,使用速度更快。sub
tools::file_path_sans_ext
library(fs)
library(stringr)
library(microbenchmark)
files<-paste0("http://some/ppath/to/som/cool/file/",1:1000,".flac")
microbenchmark(
fs::path_ext_remove(sub(".*/", "", files)),
tools::file_path_sans_ext(sub(".*/", "", files)),
str_extract(files, '(?<=[/])([^/]+)(?=\\.[^.]+)')
)
Unit: milliseconds
expr min lq mean median uq max neval
fs::path_ext_remove(sub(".*/", "", files)) 10.6273 10.98940 11.323063 11.20500 11.4992 14.5834 100
tools::file_path_sans_ext(sub(".*/", "", files)) 1.3717 1.44260 1.532092 1.48560 1.5588 2.4806 100
str_extract(files, "(?<=[/])([^/]+)(?=\\\\.[^.]+)") 7.4197 7.62875 7.985206 7.88835 8.2311 9.4107 100
你可以使用substring()
filename <- "test_channels.csv"
only.extension <- substring(filename,nchar(filename) - 3 )
without_ext.name <- substring(filename,1, nchar(filename) - 4 )
# verify
only.extension
without_ext.name
我希望它会有所帮助。
评论