【问题标题】:How to extract a name from a content of a text file?如何从文本文件的内容中提取名称?
【发布时间】:2015-07-22 19:39:17
【问题描述】:

我有一个可以读作的文本文件:

    file=read.table("C:\\data.txt", sep="")
    > class(file)
   [1] "data.frame"
    > head(file)
    name     bat     cat co ro
 1 face     2        16 25  96

我在一个目录中有许多文本文件,可以列为:

   dir<- list.files("C:\\datasets", "*.txt", full.names = TRUE)

文件命名如下:

     ds_ds_df_2011_ 25_96.txt
     this corresponds to:
    ds_ds_df_2011_ co_ro.txt # co ro change while the rest is the same in all files.

其中cofile$corofile$ro

我需要的是将file$name中的相应name添加到文件名中,以成为: ds_ds_df_2011_ co_ro_name.txt

这可能吗?

【问题讨论】:

  • How do I rename files using R? 的可能重复项
  • 一点也不。它与那个无关。
  • 哇,真的吗?您不是要重命名文件吗?
  • 只是将从文本文件中提取的名称添加到它们?
  • 我的理解是你想将ds_ds_df_2011_ 25_96.txt重命名为ds_ds_df_2011_ 25_96_face.txt

标签: r


【解决方案1】:

因为你似乎懒得自己尝试:

library(stringr)

sapply(dir,function(x) { 
             val <- str_match(x,"ds_ds_df_2011_ (\\d+)_(\\d+).txt")         
             dest <- paste0( sub(".txt$","",x), "_", df$name[df$co==val[2] & df$ro==val[3]],".txt") 
             file.rename(x,dest)  
           })

dest行做了什么:

  • sub(".txt","",x)把文件名中的.txt去掉
  • df$name[df$co==val[2] &amp; df$ro==val[3]] 从数据框中获取名称,其中 co 和 ro 是从之前的文件名中提取的值。
  • paste0(...) 将文件名的开头、下划线、从 df 中提取的名称和 .txt 扩展名粘在一起

我使用了df,而不是你原来的file。通用建议:永远不要使用关键字作为变量名,这会导致问题。

在使用之前备份您的文件。

【讨论】:

    【解决方案2】:

    这是一个使用match() 在数据框中查找正确名称的版本(这里命名为df)并且不需要任何包。但请注意,它假定dir 中的文件名顺序与df 中的行顺序相匹配。

    df <- data.frame(name = c("face", "head"), bat = seq(2), cat = c(16, 26), co = c(25, 35), ro = c(96, 106))
    dir <- c("ds_ds_df_2011_ 25_96.txt", "ds_ds_df_2011_ 35_106.txt")
    
    sapply(dir, function(x) {
      sub("\\.", paste0("_", df$name[match(x, dir)], "."), x)
    })
    

    这是输出:

            ds_ds_df_2011_ 25_96.txt        ds_ds_df_2011_ 35_106.txt 
     "ds_ds_df_2011_ 25_96_face.txt" "ds_ds_df_2011_ 35_106_head.txt"
    

    【讨论】:

    • 顺序是个问题,因为 dir 中文件名的顺序与 df 中的行顺序匹配。
    • 如果匹配,那么这应该有效。如果订单不匹配,就会出现问题。你试过了吗?
    • 对不起。我想说不匹配 df 中的行顺序。
    • 是的,这可能太脆弱而无用。以前的答案更灵活,因此更好。
    猜你喜欢
    • 2014-10-30
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    相关资源
    最近更新 更多