【发布时间】:2015-05-20 18:14:30
【问题描述】:
我有一个文件
ABCD.csv
.csv前面的长度不固定,可以任意长度变化。
如何提取.csv之前的部分。
【问题讨论】:
我有一个文件
ABCD.csv
.csv前面的长度不固定,可以任意长度变化。
如何提取.csv之前的部分。
【问题讨论】:
标准安装 tools 包中有一个内置的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))
您可以使用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> 并且没有其他情况,这会起作用
你也可以试试这个:
data <- "ABCD.csv"
gsub(pattern = "\\.csv$", "", data)
#[1] "ABCD"
这对于文件列表也很有帮助,比如说
data <- list.files(pattern="\\.csv$") ,使用该代码将删除列表中所有文件的扩展名。
【讨论】:
如果您的文件名具有多个(可能的扩展名)并且您只想删除最后一个扩展名,您可以尝试以下操作。
考虑文件名foo.bar.baz.txt这个
sub('\\..[^\\.]*$', '', "foo.bar.baz.txt")
会给你留下foo.bar.baz。
【讨论】:
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"
【讨论】:
这是一个适用于压缩和多个文件的实现:
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:
与其他答案的原理基本相同。只是我发现这个解决方案更强大。
正则表达式意味着:
() = 组
.* = 除换行符以外的任意单个字符,任意次数
// 是转义符号,因此是 //。字面意思是“。”
.* = 任意字符多次重复
$ 表示应该在输入字符串的末尾
这样的逻辑是它将返回“。”之前的组。后跟字符串末尾的一组字符(在这种情况下等于文件扩展名)。
【讨论】: