2016-10-25 9 views
2

を決定し、その後、フィルタリングするには、私は4個のファイルとディレクトリがあるとしましょう:正規表現は、最新の日付

someText.abcd.xyz.10Sep16.csv 
someText.xyz.10Sep16.csv 
someText.abcd.xyz.23Oct16.csv 
someText.xyz.23Oct16.csv 

これは名前がフォーマットされている方法です。私はそれらを変更することはできませんし、日付は変更されますが、フォーマットは変わりません。すべての名前はsomeTextで始まります。次に、4文字のコード(abcd)または3つのコード(xyz)のいずれかがあります。ファイル名に4文字のコードがある場合は、その後ろに常に3文字のコードが付きます。最後に日付の値があります。

私には2つのタスクがあります。まず、 "abcd"コンポーネントを持つファイルをフィルタリングする必要があります。これは、名前にsomeText.の後に表示される4文字のコードです。正規表現を使ってこれらの値を削除する方法はありますか?私は後日でのみファイルが必要

someText.xyz.10Sep16.csv 
someText.xyz.23Oct16.csv 

:2つのファイルを残し

。日付を抽出し、最新のものを見つけて、その日付だけを保存するためにできる2番目の正規表現はありますか?私は、ファイルが4まで設定を取得するためにこれをやっている:

myDir <- "\\\\myDir\\folder\\" 
files <- list.files(path = myDir, pattern = "\\.csv$") 

誰かがそれを試してみたい場合はここでファイル名を持つベクトルです:

files <- c("someText.abcd.xyz.10Sep16.csv", "someText.xyz.10Sep16.csv", "someText.abcd.xyz.23Oct16.csv", "someText.xyz.23Oct16.csv") 

答えて

2

は、シンプルなベースRの答え

# regex subset 
files <- files[!grepl("^.*?\\.[[:alpha:]]{4}\\.", files)] 

# get date 
dates <- unlist(lapply(strsplit(files, "\\."), "[[", 3)) 

files[which.max(as.Date(dates, format = "%d%b%y"))] 
# [1] "someText.xyz.23Oct16.csv" 
での私の試みです
1

私は、これは十分に強固であるべきだと思います確実に仕事をする。私はdplyrを使用して結果を渡して操作し、lubridateは便利な日付抽出(dmy)です。ほとんど忘れてしまった:magrittrをロードして%$%パイプを入手する必要があります。

「。」でファイル名を分割し、4文字のコードセクションがない場合は結果をスライドします。簡単なフィルタリングなどのためにそれらをdata.frameにバインドします。ここでは、4文字のセクションを欠いているものをフィルタリングし、最新の日付のものを選択します。

strsplit(files, "\\.") %>% 
    setNames(files) %>% 
    lapply(function(x){ 
    if(length(x) == 4){ 
     x[3:5] <- x[2:4] 
     x[2] <- "noCode" 
    } 
    rbind(x) %>% 
     as.data.frame() 
    }) %>% 
    bind_rows(.id = "fileName") %>% 
    mutate(date = dmy(V4)) %>% 
    filter(V2 == "noCode") %$% 
    c(fileName[which.max(date)]) 

リターン: "someText.xyz.23Oct16.csv"

1

私はこれがよりコンパクトにすることができると確信しているが、ここではベースRの答えです:

# file names 
file_names =c(
    "someText.abcd.xyz.10Sep16.csv", 
    "someText.xyz.10Sep16.csv", 
    "someText.abcd.xyz.23Oct16.csv", 
    "someText.xyz.23Oct16.csv" 
) 

# the pattern to be tested 
reg_file_names = regexec(
    pattern = "^someText\\.[a-z]{4}\\.[a-z]{3}\\.(.*).csv$", 
    file_names 
) 

# parse out the matched dates, and look for the maximum 
file_names[ 
    which.max(
    sapply(
     regmatches(
     x = file_names, m = reg_file_names 
    ), 
     function(match) { 
     as.Date(
      ifelse(
      length(match) == 0, 
      NA, 
      match[2] 
     ), 
      format = "%d%b%y" 
     ) 
     } 
    ) 
) 
    ] 

定期あなたが必要とする表現はかなり単純です。残りのコードは、一致がない場合を処理し、比較できるように日付を整形することだけです。ここで