2017-08-18 4 views
0

私はたくさんのファイルを持っています。入れ子になったforloopを使ってtarファイルを作成するR

BNT_20170301131740322_123456.csv, BNT_20170301131740322_7891011.csv 

をこのファイル名では、12文字までの第五の文字から開始日および13日で、14日の文字が時間である次のように彼らは名前が付けられています。残りは動的に生成され、変化し続けます。上記の例では、日付は2017年3月1日で、時間は13

タスク1: 私は特定の日付と時間に一致するすべてのファイルをビュンによってtarファイルを作成する必要があります。したがって、ファイルが生成される日時に応じて、出力として複数のtarファイルが作成されます。

タスク2: 次のタスクは、特定のパターンでtarファイルに名前を付けることです。

BNT_2017030111_2.tar 
私たちは「BNT_」を見ることができる上記の名前で

日付と時間が続く保持され、_(アンダースコア)後の2ファイルの数を示します。 各tarファイルは、次のパターンに名前を付ける必要があります日付と時刻に一致するタールの内側。上の例では、名前は2017年3月1日の日付と11の時のファイルが一緒にタールされていて、その内部に2つのファイルがあることを示しています。

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) 
} 

以上が作成されます。私は再現

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") 

のための私のコードをすべてのファイルの名前をリストした

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

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

:私は、これまで行ってきた

tarファイルの必要数しかし、tarファイルには、最初のtar自体にあるフォルダ内のすべてのファイルが含まれており、後続のすべてのtarファイルの元のファイルとともに、すべての新しいtarファイルが再帰的に含まれます。例えば

は、最初のtarファイルではなく、パターンのみpat

二tarファイルは、最初のtarファイルを持っている+それはだけではなく、それらのすべてのCSVファイルを持っていると一致しているもののすべてのCSVファイルを持っていますパターンpatに一致します。

これで、作成されたすべてのtarファイルが続き、最後のtarファイルには作成されたすべてのtarファイルと、patに一致するすべてのファイルが保存されます。

所望の出力は次のようになります。

タールBNT_ +日+などのようになりますファイル+の.tarの時間+数でそれらをファイル名に日付と時間と一致し、名前を付けたファイルのみ次のようになります。

BNT_2017030111_2.tar 

ダミーファイルを含むフォルダを作成しました。それは場合に役立ちます念のために:

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

答えて

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) 
}) 
+0

一つは、tarは持っているファイルの数が含まれるようにファイル名をリネームして...ともstrsplitはBNT後に、アンダースコアだけから最初の10の文字とは対照的に、完全な文字列を取得します。私のファイル名の残りの文字は変わっているので、 'substring'でラップした' strsplit'を試みて、最初の10文字を取得しました...しかし、9番目と10番目の文字(時間)変更...あなたのコードから何かを逃した場合はごめんなさい...ご理解ください。 – Apricot

+0

@Aricos私の解決策はあなたのコードの最後の部分のみを話します。 'pat 'はそれを作成するのと同じままです(おそらく動作します)。残りの部分は、同様のファイル名を見つけて同じタールに入れる方法です。おそらく、あなたはあなたの質問を編集し、どのファイルをどこに書き留めるべきかを指定することができます。 –

+0

@akrunこの質問の解決方法を手伝ってもらえますか? – Apricot

関連する問題