2016-09-07 30 views
0

複数のピリオド文字を含むファイルパスでファイル拡張子のみを削除しようとしています。他の質問はtools::file_path_sans_extを使用するように提案されていますが、1つ以上のピリオドのパスでは機能しないようです。私が使用できる別の方法や回避策がありますか?パスに複数のピリオド文字 '。'が含まれるファイル名と拡張子を取得します。

path <- "BONCAT_CE_7142-Q-ConsG09/IMG_Data/87243.assembled.bin_assignment" 
tools::file_path_sans_ext(path) 
#> "BONCAT_CE_7142-Q-ConsG09/IMG_Data/87243.assembled.bin_assignment" 

誤って!あるべきBONCAT_CE_7142-Q-ConsG09/IMG_Data/87243.assembled

+1

コンソールに関数のコードを見れば、あなたはそれが 'サブ(使用して見ることができます "([^。] +)を\\ [[:alnum:]]を。+ $"、"ファイル拡張子はちょうど英数字で、a-zA-z0-9のみであると仮定します。これは '?tools :: file_path_sans_ext'のヘルプファイルにもあります。*(純粋に英数字の拡張子)* – thelatemail

答えて

2

あなたは少し、正規表現を使用する必要があるかもしれません:$

sub("\\.[^.]*$", "", path) 
# [1] "BONCAT_CE_7142-Q-ConsG09/IMG_Data/87243.assembled" 

これは、文字列の最後のピリオド(包括的)の後に、すべてを削除するには、文字列の末尾にマッチします。 [^.]*は、非周期シーケンスと期間\\.に一致します。

0

私はできるだけ移植することを決めました。私はPython splitextの機能を果たすことができました。それは私が見ていたいくつかのコーナーケースを処理します。

splitext <- function(x) { 
    periods <- gregexpr("\\.", x)[[1]] 
    if (periods[1] == -1) { 
     result <- c(x, "") 
    } 
    else if (length(periods) == 1) { 
     result <- c(substr(x, 1, periods[1] - 1), substring(x, periods[1] + 1)) 
    } 
    else { 
     result <- c(substr(x, 1, periods[-1] - 1), substring(x, periods[-1] + 1)) 
    } 
    result 
} 
関連する問題