我有点像R新手,因此有疑问。
我有一个文件
ABCD.csv
.csv之前的长度不固定,并且可以变化为任何长度。 如何在.csv之前提取部分。
答案 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)
您可以使用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'
答案 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"