Holen Sie sich den Dateinamen ohne Erweiterung in R.

71

Ich habe eine Datei

ABCD.csv 

Die Länge vor dem .csvist nicht festgelegt und variiert zu jeder Länge.

Wie kann ich die Portion vor dem extrahieren .csv.

Matrix.cursor
quelle

Antworten:

128

Es gibt einen eingebauten in file_path_sans_extder Standard - Installation von Tools - Paket , das die Datei ohne die Erweiterung packt.

tools::file_path_sans_ext("ABCD.csv")
## [1] "ABCD"
Tyler Rinker
quelle
8
Wer sich für weitere Details zu diesem und ähnlichen Funktionen suchen, werfen Sie einen Blick auf?tools::file_ext
thelatemail
36

basenameentfernt auch den Pfad, der zur Datei führt. Und mit dieser Regex wird jede Erweiterung entfernt.

filepath <- "d:/Some Dir/ABCD.csv"
sub(pattern = "(.*)\\..*$", replacement = "\\1", basename(filepath))

# [1] "ABCD"

Oder file_path_sans_extwie Tyler Rinker vorgeschlagen hat:

file_path_sans_ext(basename(filepath))

# [1] "ABCD"
Jason V.
quelle
Sonderfall: Eine Datei mit "mehreren Erweiterungen" wie "ABCD.txt.csv" (ja, es passiert), dann fügen Sie einfach ein "?" um den Ausdruck nicht gierig zu machen:sub(pattern = "(.*?)\\..*$", replacement = "\\1", basename(filepath))
Jason V
17

Sie können suboder verwendensubstr

sub('\\.csv$', '', str1) 
#[1] "ABCD"

oder

substr(str1, 1, nchar(str1)-4)
#[1] "ABCD"

Verwenden des 'Dateipfads' aus dem Beitrag von @ JasonV

sub('\\..*$', '', basename(filepath))
#[1] "ABCD"

Oder

library(stringr)
str_extract(filepath,  perl('(?<=[/])([^/]+)(?=\\.[^.]+)'))
#[1] "ABCD"

Daten

str1 <- 'ABCD.csv'
akrun
quelle
1
Ja, es würde auch entfernen. Warum brauchst du das .nach dem \\.Könnte das auch .buchstäblich sein dhfoo..
akrun
Sie haben natürlich Recht, das war ein Tippfehler. Mein Fehler. Jetzt kann ich das nicht mehr bearbeiten.
stephanmg
1
@stephanmg Es könnte Randfälle wie foo.Nicht sicher, was mit diesen zu tun ist
akrun
1
@stephanmgIch würde sagen, dass Regex ein benutzerdefinierterer Fall wäre, dh er kann nicht auf alle allgemeinen Fälle angewendet werden. Angenommen, das OP-Mentioin, das er / sie erst .<word>am Ende haben wird und es keine anderen Fälle gibt, würde funktionieren
akrun
1
Okay, ich denke das ist dann in Ordnung.
stephanmg
4

Sie können dies auch versuchen:

data <- "ABCD.csv"
gsub(pattern = "\\.csv$", "", data)

#[1] "ABCD"

Dies ist beispielsweise auch bei einer Liste von Dateien hilfreich

data <- list.files(pattern="\\.csv$") Wenn Sie den Code verwenden, wird die Erweiterung aller Dateien in der Liste entfernt.

Agaz Wani
quelle
2

Wenn Sie Dateinamen mit mehreren (möglichen Erweiterungen) haben und nur die letzte Erweiterung entfernen möchten, können Sie Folgendes versuchen.

Betrachten Sie den Dateinamen foo.bar.baz.txtdies

sub('\\..[^\\.]*$', '', "foo.bar.baz.txt")

werde dich verlassen mit foo.bar.baz.

stephanmg
quelle
1

Hier ist eine Implementierung, die für die Komprimierung und mehrere Dateien funktioniert:

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))
}
Roler
quelle
0

Laden der benötigten Bibliothek:

> library(stringr)

Extrahieren aller Übereinstimmungen aus dem regulären Ausdruck:

> str_match("ABCD.csv", "(.*)\\..*$")
     [,1]       [,2]  
[1,] "ABCD.csv" "ABCD"

Rückgabe nur des zweiten Teils des Ergebnisses, der der Gruppe entspricht, die dem Dateinamen entspricht:

> str_match("ABCD.csv", "(.*)\\..*$")[,2]
[1] "ABCD"

BEARBEITEN für @ U-10-Forward:

Es ist im Grunde das gleiche Prinzip wie die andere Antwort. Nur dass ich diese Lösung robuster fand.

Regex weise bedeutet es:

  • () = Gruppe

  • . * = ein beliebiges einzelnes Zeichen außer dem Zeilenumbruchzeichen beliebig oft

  • // ist Escape-Notation, also //. bedeutet wörtlich "."

  • . * = beliebige Zeichen beliebig oft

  • $ means sollte am Ende der Eingabezeichenfolge stehen

Die Logik ist dann, dass es die Gruppe vor einem "." Zurückgibt. gefolgt von einer Gruppe von Zeichen am Ende der Zeichenfolge (die in diesem Fall der Dateierweiterung entspricht).

SJGD
quelle