tag - Regex devuelve el nombre del archivo, elimina la ruta y la extensión del archivo
simple regex (2)
En primer lugar, para deshacerte de la "ruta principal", puedes usar basename
. Para eliminar la extensión, puede usar sub
similar a su descripción en su pregunta:
filenames <- sub("//.[[:alnum:]]+$", "", basename(as.character(df$fileNames)))
Tenga en cuenta que debe usar sub
lugar de gsub
aquí, porque la extensión del archivo solo puede ocurrir una vez para cada nombre de archivo. Además, debes usar //.
que coincide con un punto en lugar de .
que coincide con cualquier símbolo. Finalmente, debe agregar $
al patrón para asegurarse de que está eliminando la extensión solo si está al final del nombre de archivo.
Edición: la función file_path_sans_ext
sugerida en la solución de Ananda Mahto funciona a través de sub("([^.]+)//.[[:alnum:]]+$", "//1", x)
, es decir , en lugar de eliminar el extensión como arriba, la parte que no es extensión del nombre de archivo se conserva. No puedo ver ninguna ventaja o desventaja específica de ambos métodos en el caso del OP .
Tengo un data.frame que contiene una columna de texto de nombres de archivos. Me gustaría devolver el nombre del archivo sin la ruta o la extensión del archivo. Normalmente, mis nombres de archivo han sido numerados, pero no tienen que serlo. Por ejemplo:
df<-data.frame(data=c("a","b"),fileNames=c("C:/a/bb/ccc/NAME1.ext","C:/a/bb/ccc/d D2/name2.ext"))
Me gustaría devolver el equivalente de
df<-data.frame(data=c("a","b"),fileNames=c("NAME","name"))
pero no puedo entender la expresión regular para hacer esto con gsub. Por ejemplo, puedo deshacerme de la extensión con (siempre que el nombre del archivo termine con un número):
gsub(''([0-9]).ext'','''',df[,"fileNames"])
Aunque he estado probando varios patrones (leyendo los archivos de ayuda de expresiones regulares y soluciones similares en este sitio), no puedo obtener una expresión regular para devolver el texto entre la última "/" y la primera ".". ¡Cualquier pensamiento o remisión a preguntas similares son muy apreciados!
Lo mejor que he conseguido es:
gsub(''*[[:graph:]_]/|*[[:graph:]_].ext'','''',df[,"fileNames"])
Pero este 1) no elimina todos los caracteres de ruta principales y 2) depende de una extensión de archivo específica.
Quizás esto te acerque más a tu solución:
library(tools)
basename(file_path_sans_ext(df$fileNames))
# [1] "NAME1" "name2"
La función file_path_sans_ext
es del paquete de "herramientas" (que creo que generalmente viene con R), y que extraerá la ruta hasta (pero sin incluir) la extensión. La función de basename
se deshará de la información de su ruta.
O, para tomar de file_path_sans_ext
y modificarlo un poco, puedes intentar:
sub("(.*///)([^.]+)(//.[[:alnum:]]+$)", "//2", df$fileNames)
# [1] "NAME1" "name2"
Aquí, "capturé" las tres partes de las variables "fileNames", por lo que si quisiera solo las rutas del archivo, cambiaría "//2"
a "//1"
, y si quisiera solo las extensiones de archivo , lo cambiarías a "//3"
.