web-dev-qa-db-fra.com

Fractionner un nom de fichier en nom, extension

J'ai le nom d'un fichier comme celui-ci: name1.csv et je voudrais extraire deux sous-chaînes de cette chaîne. Celui qui stocke le name1 dans une variable et une autre qui stocke l'extension, csv, sans le point dans une autre variable.

J'ai cherché s'il y avait une fonction comme indexOf de Java qui permet de faire ce genre de manipulation, mais je n'ai rien trouvé du tout.

De l'aide?

36
Layla

Utilisez strsplit:

R> strsplit("name1.csv", "\\.")[[1]]
[1] "name1" "csv"  
R> 

Notez que vous a) devez échapper au point (car il s'agit d'un métacaractère pour les expressions régulières) et b) faites face au fait que strsplit() renvoie une liste dont généralement seul le premier élément est intéressant.

Une solution plus générale implique des expressions régulières où vous pouvez extraire les correspondances.

Pour le cas particulier des noms de fichiers, vous avez également:

R> library(tools)   # unless already loaded, comes with base R
R> file_ext("name1.csv")
[1] "csv"
R> 

et

R> file_path_sans_ext("name1.csv")
[1] "name1"
R> 

car ce sont des tâches très courantes (cf. basename dans Shell, etc.).

61
Dirk Eddelbuettel

Utilisez strsplit():

http://stat.ethz.ch/R-manual/R-devel/library/base/html/strsplit.html

Exemple:

> strsplit('name1.csv', '[.]')[[1]]
[1] "name1" "csv"  

Notez que le deuxième argument est une expression régulière, c'est pourquoi vous ne pouvez pas simplement passer un seul point (il sera interprété comme "n'importe quel caractère").

7
Adam Stelmaszczyk

En utilisant une expression régulière, vous pouvez le faire par exemple

regmatches(x='name1.csv',gregexpr('[.]','name1.csv'),invert=TRUE)
[[1]]
[1] "name1" "csv"  
2
agstudy