R에서 확장자가 없는 파일 이름 가져오기
파일이 있습니다.
ABCD.csv
앞의 길이.csv
는 고정되지 않으며 길이가 다릅니다.
어떻게 해야만 그 전에 부분을 추출할 수 있습니까?.csv
?
에 내장되어 있습니다.file_path_sans_ext
표준 설치 도구 패키지에서 확장자 없이 파일을 가져옵니다.
tools::file_path_sans_ext("ABCD.csv")
## [1] "ABCD"
basename
파일로 이어지는 경로도 제거됩니다.이 정규식을 사용하면 모든 확장이 제거됩니다.
filepath <- "d:/Some Dir/ABCD.csv"
sub(pattern = "(.*)\\..*$", replacement = "\\1", basename(filepath))
# [1] "ABCD"
또는, 사용file_path_sans_ext
타일러 링커가 제안한 것처럼:
file_path_sans_ext(basename(filepath))
# [1] "ABCD"
사용할 수 있습니다.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'
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"
다음과 같은 방법도 사용할 수 있습니다.
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
.
다음은 압축 및 여러 파일에 사용할 수 있는 구현입니다.
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))
}
위의 답변들은 훌륭하지만, 저는 한 번에 수백만 개의 길을 처리하기 위해 어떤 것이 가장 빠른지에 관심이 있었습니다.를 사용하는 것 같습니다.sub
이 SO 질문을 통해 파일 이름을 경로에서 꺼내는 것이 가장 빠릅니다. 그리고 위의 세 가지 방법을 비교합니다.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
필요한 라이브러리 로드:
> library(stringr)
정규식에서 모든 일치 항목 추출:
> str_match("ABCD.csv", "(.*)\\..*$")
[,1] [,2]
[1,] "ABCD.csv" "ABCD"
파일 이름과 일치하는 그룹에 해당하는 결과의 두 번째 부분만 반환:
> str_match("ABCD.csv", "(.*)\\..*$")[,2]
[1] "ABCD"
@U-10-Forward에 대한 편집:
기본적으로 다른 답변과 동일한 원칙입니다.단지 이 솔루션이 더 견고하다는 것을 알게 되었습니다.
정규식의 의미는 다음과 같습니다.
() = 그룹
= 새 줄 문자를 제외한 모든 단일 문자, 임의의 횟수
이스케이프 표기이므로 //.는 문자 그대로 "."를 의미합니다.
= 임의의 문자가 몇 번이고 반복됩니다.
평균은 입력 문자열의 끝에 있어야 합니다.
그런 다음 "." 앞에 그룹을 반환하고 문자열 끝에 있는 문자 그룹(이 경우 파일 확장자와 동일)을 반환합니다.
언급URL : https://stackoverflow.com/questions/29113973/get-filename-without-extension-in-r
'programing' 카테고리의 다른 글
Firebase 사용자의 displayName을 설정하려면 어떻게 해야 합니까? (0) | 2023.06.26 |
---|---|
Can't get query string parameter value (0) | 2023.06.26 |
함수 포인터로 함수 전달 (0) | 2023.06.26 |
수식에서 셀 참조에 대한 Excel 검색 (0) | 2023.06.26 |
TypeScript에서 중첩된 개체 (0) | 2023.06.26 |