在R

时间:2017-08-18 02:10:19

标签: r tar

我有一堆文件。它们的名称如下:

BNT_20170301131740322_123456.csv,  BNT_20170301131740322_7891011.csv

在此文件名中,从第5个字符到第12个字符是日期,第13个和第14个字符是小时。其余的是动态生成的,并且不断变化。在上面的例子中,日期是2017年3月1日,小时是13.

任务1: 我必须通过压缩与特定日期和小时匹配的所有文件来创建tar文件。因此,根据生成文件的日期和时间,我将有多个tar文件作为输出。

任务2: 下一个任务是以特定模式命名tar文件。 应使用以下模式命名每个tar文件:

BNT_2017030111_2.tar

在上面的名字中我们可以看到" BNT _"保留后跟日期和小时,后面的_(下划线)表示tar中与日期和时间匹配的文件数。在上面的示例中,名称表示文件的日期为2017年3月1日,小时参数11一起使用,tar中有2个文件。

到目前为止我做了什么:

#set the working directory
setwd("/home/mycomp/Documents/filestotar/")

#list all files
files <- list.files(pattern = ".csv") 

我列出了所有文件的可重复性名称

files <- c("BNT_20170301000000790_123456.csv", "BNT_20170301000000887_7891011.csv",
"BNT_20170301000000947_7430180.csv", "BNT_20170301000001001_2243094.csv", 
"BNT_20170301000001036_14195326.csv", "BNT_20170301000001036_14770776.csv", 
"BNT_20170301000001078_10692013.csv", "BNT_20170301000001089_2966772.csv", 
"BNT_20170301000001100_10890506.csv", "BNT_20170301000001576_7430180.csv")

我的代码:

library(stringr)
#extract date and time and set the pattern to identify the files in the folder
#extracts date from the file name
d <- substr(files, 5,12)

#extracts hour from the file name
e <- substr(files, 13,14)

#creates a pattern that can be used to identify the files matching the pattern.
pat <- paste("BNT","_",unique(d),unique(e),sep="")

#creates the count of files with unique hour parameter.  This will be used to create the name for the tar file.
f <- table(paste(d,e,sep=""))

#create unique names for the tar files
g <- unique(paste("BNT",unique(d),unique(e),f,sep="_"))

#pasting the extension .tar to the name of the file
h <- paste(g,".tar",sep="")



#create a nested forloop to tar the files recursively
for (name in h) {
  for (i in seq_along(pat)) {
    filestotar = for (i in seq_along(pat)) {list.files(path = "/home/mycomp/Documents/filestotar/", pattern = pat[i])}
  }
  tar(tarfile = name, files = filestotar)
}

以上创建了所需数量的tar文件。但tar文件包含第一个tar本身的文件夹中的所有文件,并递归地包含所有后续tar文件中文件夹中原始文件的所有新tar文件。

例如,第一个tar文件包含所有csv文件,而不仅仅是那些匹配模式pat

的文件

第二个tar文件包含第一个tar文件+它包含所有csv文件,而不只是那些匹配模式pat的文件。

现在,每个创建的tar文件都会继续,最后一个tar文件包含所有创建的tar文件+所有匹配pat的文件。

所需的输出是:

仅匹配那些与文件名中的日期和小时匹配的文件,并将其命名为BNT_ +日期+小时+文件数+ .tar,如下所示:

BNT_2017030111_2.tar

创建了包含虚拟文件的文件夹...以防万一,如果有帮助:

https://drive.google.com/open?id=0BwPrNXRo3C1aaUN2WmMtS3dpZ1U

1 个答案:

答案 0 :(得分:0)

为了避免循环(不是必需的,但我在这里选择),您可以创建一个data.frame,其中包含有关文件的所有信息。反过来,您可以对其进行切片和切块以获得所需的相应文件名。

xy <- data.frame(files = files, date = d, hour = e)

out <- split(xy, f = list(xy$date, xy$hour))

result <- sapply(out, FUN = function(x) {
  nfiles <- nrow(x)
  name <- paste("BNT_", unique(x$date), unique(x$hour), "_", nfiles, ".tar", sep = "")

  ### just for show, you can remove ###
  message(sprintf("For %s extracting %s files:", name, nfiles)) 
  for (i in x$files) {
    message(i)
  }
  ### end just for show ###
  tar(tarfile = name, files = x$files)
})