web-dev-qa-db-ja.com

Rのフルパスパターンに一致するすべてのファイルのリスト

full-pathパターンに一致するファイルのリストを取得しようとしています。これまでのところ、list.files()を使用しましたが、機能しませんでした。

次のディレクトリ構成があるとします。

results
   |- A
   |  |- data-1.csv
   |  |- data-2.csv
   |
   |- B
      |- data-1.csv
      |- data-2.csv

次に、次のコマンド:

list.files(pattern='data-.*\\.csv', recursive=TRUE)

パターンに一致するすべてのファイルを返します。これは機能しますが、full-pathパターンを使用すると問題が発生します。たとえば、ディレクトリresults/AからすべてのCSVファイルを取得したい場合は、次のようにします。

list.files(pattern='results/A/data-.*\\.csv', recursive=TRUE)

ただし、これは機能しません。どういうわけか、Rはフルパスパターンを正規表現として使用できないようです。この場合の解決策は、ベースパスとしてresults/Aを使用することです。しかし、より複雑な問題では、それは不可能です。たとえば、ある時点で、文字のみを含むサブディレクトリを一致させたい場合があります。

list.files(pattern='results/[A-Z]+/data-.*\\.csv', recursive=TRUE)

Rでこれを行うことは可能ですか?

UPDATE:アドホックソリューションをしばらく使用した後、同じものを何度も入力するのをやめることにしました。そこで、このタスクを簡略化するために library を作成しました。

26
betabandido

まず、正規表現パターンを使用していないことに注意してください。最初の例は次のようになります。

list.files(pattern='data-.*\\.csv', recursive=TRUE)

次に、list.files内のパターンマッチングがファイルのベース名(つまり、ディレクトリパスを含まない)に適用されているように見えるため、タスクを次のように分割できます。

  1. ベース名のみに一致するすべてのファイルを検索し、完全なパスを返します。

    basename.matches <- list.files(pattern='data-.*\\.csv', recursive=TRUE,
                                   full.names = TRUE)
    basename.matches
    # [1] "./results/A/data-1.csv" "./results/A/data-2.csv" "./results/B/data-1.csv"
    # [4] "./results/B/data-2.csv"
    
  2. 予想されるディレクトリに一致するもののみを保持します。

    full.matches <- grep(pattern='^\\./results/A/', basename.matches, value = TRUE)
    full.matches
    # [1] "./results/A/data-1.csv" "./results/A/data-2.csv"
    
30
flodel

pathの各要素をループし、そこに含まれるファイルに正規表現を適用するため、list.filesだけでこれを行うことはできません。ただし、list.filespath引数はベクトルを受け入れることができるので、それを使用して問題を解決できます。

dirs <- grep("[A-Z]+$",list.dirs("results",recursive=FALSE),value=TRUE)
list.files(dirs, "data-.*\\.csv", recursive=TRUE, full.names=TRUE)
7
Joshua Ulrich

もっと簡単な解決策があると思います:

Sys.glob(file.path(results, "[A-Z]", "data-*.csv"))

1
michael

私が使用します

paths <- list.files(results, pattern= glob2rx("*data-*.csv$*"), full.names=T, recursive=T)
0
mga302