【问题标题】:Renaming multiple files by keeping first 6 characters通过保留前 6 个字符来重命名多个文件
【发布时间】:2020-11-26 16:41:16
【问题描述】:

如何将文件名从Pbs_d7_s2_juliam_08July2020_02_1_0_live singlets.fcs重命名为Pbs_d7_s2.fcs

对于多个文件,请记住 _juliam_08July2020_02_1_0_live singlets 并非对所有文件都相同?

【问题讨论】:

  • 你有没有尝试过?计数的字符是仅字母还是字母数字?字符数中是否排除了下划线和扩展名?提供的示例有五个字母字符和七个字母数字字符(不包括下划线和扩展名)。

标签: r file rename


【解决方案1】:

您的要求有点不清楚,但看起来您只想保留第三个下划线之前的块。如果是这样,您可以使用正则表达式来解决这个问题。正则表达式

    str_extract(input_string, "^(([^_])+_){3}")

将取出以下划线结尾的前 3 个字符块(不是下划线)。第一个 ^ "anchors" 匹配到字符串的开头,"[^_]+_" 匹配下划线之前的任意数量的非下划线字符。 {3} 执行上述操作 3 次。

因此,对于“Pbs_d7_s2_juliam_08July2020_02_1_0_live singlets.fcs”,您最终会得到“Pbs_d7_s2_”。现在你只需像这样用“.fcs”替换最后一个下划线

    str_replace(modified string, "_$", ".fcs")

$“锚”它前面的字符到字符串的末尾,所以在这种情况下,它会替换最后一个下划线。完整的序列是

    string1<- "Pbs_d7_s2_juliam_08July2020_02_1_0_live singlets.fcs" 
    str_extract(string1, "^(([^_])+_){3}") %>%
    str_replace("_$",".fcs")

    [1] "Pbs_d7_s2.fcs"

现在让我们假设您的文件名在一个名为 stringvec 的向量中。

    output <- vector("character",length(stringvec))
    for (i in seq_along(stringvec)) {
    output[[i]] <- str_extract(stringvec[[i]],"^(([^_])+_){3}")%>% 
    str_replace("_$",".fcs")
     }
     output

我在这里做了一些假设 - 即所有文件的命名约定都是相同的。如果不是这样,您将需要找到修改正则表达式搜索模式的方法。

我推荐这个答案How do I rename files using R? 来替换文件名的向量。如果您有原始文件名的向量,您可以使用我的 for 循环生成新名称的向量,然后您可以使用链接中的信息将一个替换为另一个。也许还有其他不涉及 for 循环的解决方案。

【讨论】:

  • 我应该指定你需要 stringr 包用于我使用的函数,而 magrittr 包用于 for 循环中的 %>% 符号。所以你可以将 library(stringr) 和 library(magrittr) 添加到顶部,或者更好的是 library(tidyverse)
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 2021-02-14
  • 2020-09-03
  • 2021-04-06
  • 1970-01-01
  • 2021-02-12
  • 2016-03-22
  • 1970-01-01
相关资源
最近更新 更多