programing

R에서 확장자가 없는 파일 이름 가져오기

instargram 2023. 6. 26. 21:01
반응형

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

위의 답변들은 훌륭하지만, 저는 한 번에 수백만 개의 길을 처리하기 위해 어떤 것이 가장 빠른지에 관심이 있었습니다.를 사용하는 것 같습니다.subSO 질문을 통해 파일 이름을 경로에서 꺼내는 것이 가장 빠릅니다. 그리고 위의 세 가지 방법을 비교합니다.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

반응형