19

ファイル名のテキスト列を含む data.frame があります。パスまたはファイル拡張子なしでファイル名を返したいと思います。通常、ファイル名には番号が付けられていますが、そうである必要はありません。例えば:

df<-data.frame(data=c("a","b"),fileNames=c("C:/a/bb/ccc/NAME1.ext","C:/a/bb/ccc/d D2/name2.ext"))

に相当するものを返したい

df<-data.frame(data=c("a","b"),fileNames=c("NAME","name"))

しかし、gsubでこれを行うための洗練された正規表現がわかりません。たとえば、次のように拡張子を削除できます (ファイル名が数字で終わる場合)。

gsub('([0-9]).ext','',df[,"fileNames"])

私はさまざまなパターンを試してきましたが (このサイトの正規表現ヘルプ ファイルと同様のソリューションを読んで)、最後の "/" と最初の "." の間のテキストを返す正規表現を取得できません。同様の質問に対する考えや転送は大歓迎です!

私が得た最高のものは次のとおりです。

 gsub('*[[:graph:]_]/|*[[:graph:]_].ext','',df[,"fileNames"])

しかし、これは 1) 先頭のパス文字をすべて取り除くわけではなく、2) 特定のファイル拡張子に依存しています。

4

2 に答える 2

37

おそらくこれにより、ソリューションに近づくことができます。

library(tools)
basename(file_path_sans_ext(df$fileNames))
# [1] "NAME1" "name2"

file_path_sans_ext関数は「ツール」パッケージ(通常はRに付属していると思います)からのもので、拡張子までのパス(ただし含まない)を抽出します。関数はbasenameパス情報を取り除きます。

または、から取得しfile_path_sans_extて少し変更するには、次を試すことができます。

sub("(.*\\/)([^.]+)(\\.[[:alnum:]]+$)", "\\2", df$fileNames)
# [1] "NAME1" "name2"

ここでは、「fileNames」変数の 3 つの部分すべてを「キャプチャ」したので、ファイル パスだけが必要な場合は に変更"\\2""\\1"、ファイル拡張子だけが必要な場合は に変更し"\\3"ます。

于 2013-02-25T18:34:03.130 に答える
11

まず、「先頭のパス」を取り除くには、 を使用できますbasenamesub拡張機能を削除するには、質問の説明と同様に使用できます。

filenames <- sub("\\.[[:alnum:]]+$", "", basename(as.character(df$fileNames)))

ファイル拡張子は各ファイル名に対して 1 回しか使用できないため、sub代わりにここを使用する必要があることに注意してください。gsubまた、任意の記号に一致する\\.のではなく、ドットに一致する whichを使用する必要があります。.最後に、$拡張子がファイル名の末尾にある場合にのみ拡張子を削除するように、パターンに追加する必要があります。

編集:file_path_sans_ext Ananda Mahto のソリューションで提案されている関数は、経由sub("([^.]+)\\.[[:alnum:]]+$", "\\1", x)で機能します。つまり、上記のように拡張子を削除する代わりに、ファイル名の拡張子以外の部分が保持されます。OPの場合、両方の方法の特定の利点または欠点はわかりません。

于 2013-02-25T18:33:27.140 に答える