【问题标题】:Splitting a file name into name,extension将文件名拆分为名称、扩展名
【发布时间】:2012-12-19 20:55:53
【问题描述】:

我有一个像这样的文件名:name1.csv,我想提取这个字符串的两个子字符串。一个将name1 存储在一个变量中,另一个将扩展名csv 存储在另一个变量中,而没有点。

我一直在寻找是否有像 Java 的 indexOf 这样的函数允许进行这种操作,但我根本没有找到任何东西。

有什么帮助吗?

【问题讨论】:

标签: r split substring filenames


【解决方案1】:

使用strsplit:

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

请注意,您 a) 需要转义点(因为它是正则表达式的元字符)和 b) 处理 strsplit() 返回一个列表的事实,该列表通常只有第一个元素是感兴趣的。

更通用的解决方案是使用正则表达式,您可以在其中提取匹配项。

对于文件名的特殊情况,您还有:

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

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

因为这些是非常常见的任务(参见 shell 中的 basename 等)。

【讨论】:

  • 我认为tools 包是更好的文件名方式,因为basename 也可能有点。
  • 同意,我在内部也越来越多地使用它。但请注意,答案也是 4 1/2 岁 :)
【解决方案2】:

使用strsplit():

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

例子:

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

请注意,第二个参数是正则表达式,这就是为什么您不能只传递单个点(它将被解释为“任何字符”)。

【讨论】:

    【解决方案3】:

    使用正则表达式,例如,您可以这样做

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

    【讨论】:

      猜你喜欢
      • 2011-05-31
      • 2011-05-17
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多