我有一堆文件。它们的名称如下:
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
答案 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)
})