Rを使用して、指定された拡張子を持つすべてのファイルを一覧表示する


137

私はRに非常に慣れていないため、Rスクリプトを更新して、ArcGISを使用して作成された一連の.dbfテーブルを反復処理し、一連のグラフを作成しています。

すべての.dbfファイルを含むディレクトリC:\ Scratchがあります。ただし、ArcGISがこれらのテーブルを作成すると、.dbf.xmlファイルも含まれます。これらの.dbf.xmlファイルをファイルリストから削除したいので、繰り返しを行います。正規表現を検索して実験してみたが、役に立たなかった。これは私が使用している基本的な表現です(さまざまな実験のすべてを除く):

files <- list.files(pattern = "dbf")

誰か私に指示を与えることはできますか?


1
正規表現で苦労しているがワイルドカードパターンを知ってglob2rx()いる場合、関数が役立つことがよくあります。
カラカル、2011

それは私だけですか、それとも誤解を招くタイトルですか。「特定の拡張子のみを使用して」と読む必要があります(ただし、特定の拡張子を除外するためのSOの答えは見つかりません)
J. Win。

カラカル、提案をありがとう。ジョン、もっと簡潔に言い表せたのではないかと思う。会議の前に投稿しようとしただけだった。
chawkins

正規表現について学んでいるので、簡単に除外できる方法があるかどうか疑問に思っていたので、私の注目を集めました。おそらく別の質問に値する。
J.ウィン。

回答:


198
files <- list.files(pattern = "\\.dbf$")

$終わりは、これが文字列の終わりであることを意味します。"dbf$"も機能しますが、追加する\\..正規表現では特殊文字なのでエスケープする必要があります)拡張子のあるファイルのみに一致するようにします.dbf(たとえば、.adbfファイルがある場合)。


1
その大文字と小文字は区別されますか?
nsn 2015年

6
@nsnはい。ただし、それ以外の場合ignore.caseは、関数の引数がありますlist.files(pattern = "\\.dbf$", ignore.case=TRUE)?list.files詳細については、その機能のヘルプページ()をご覧ください。
Marek、

61

正規表現ではなくグロブを使用してこれを試してみてください、それで終わるファイル名のみを選択します .dbf

filenames <- Sys.glob("*.dbf")

12

"\\.dbf"文字を使用して$文字列の最後で検索するパターンをペグします。

list.files(pattern = "\\.dbf$")

1
ドットがファイル拡張子からのドットを意味する場合、機能しません。正規表現の1文字と一致しません。
Marek

@Marekもそれに気づきました。私のカフェインの埋蔵量はしきい値を下回っているに違いありません。
Gavin Simpson、

うーん、\` escape the .` を追加したはずです。それで、なぜこれが反対票を投じられたのか不思議に思いますか?
Gavin Simpson

8

洗練された正規表現を使うのはあまり得意ではないので、次の方法でそのような作業を行います。

files <- list.files()
dbf.files <- files[-grep(".xml", files, fixed=T)]

最初の行は、作業ディレクトリのすべてのファイルを一覧表示するだけです。2つ目は、「。xml」を含むすべてを削除します(grepは、そのような文字列のインデックスを「ファイル」ベクトルで返します。負のインデックスでサブセット化すると、対応するエントリがベクトルから削除されます)。grep関数の "固定"引数は私の気まぐれです。私は通常、Perlスタイルの派手な正規表現なしで粗雑なパターンマッチングを実行したいので、驚きます。

私はそのような解決策が単に私の教育の欠点を反映していることを知っていますが、初心者にとってはそれは有用かもしれません=)少なくともそれは簡単です。


1
-前にサインを削除してくださいgrep。zipファイルから特定のファイルを抽出するには、この種のソリューションが必要でした。最初に、data.frameでファイルリストを取得し、特定のファイルを取得して、後で抽出します。 lf <- unzip(file, list=T)[,1]; files.shp <- lf[grep(".shp", lf, fixed=T)]
Sezen 2015

5

フルパスのファイルのリストを提供します:

  Sys.glob(file.path(file_dir, "*.dbf")) ## file_dir = file containing directory

長いライブsys.glob!
shadi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.